/
cbmessage.go
129 lines (105 loc) · 2.79 KB
/
cbmessage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package common
import (
"encoding/json"
"gopkg.in/yaml.v2"
"strings"
)
// ===== [ Constants and Variables ] =====
// ===== [ Types ] =====s
// ===== [ Implementations ] =====
// ===== [ Private Functions ] =====
// ===== [ Public Functions ] =====
// ConvertToMessage - 입력 데이터를 grpc 메시지로 변환
func ConvertToMessage(inType string, inData string, obj interface{}) error {
//logger := logger.NewLogger()
if inType == "yaml" {
err := yaml.Unmarshal([]byte(inData), obj)
if err != nil {
return err
}
//logger.Debug("yaml Unmarshal: \n", obj)
}
if inType == "json" {
err := json.Unmarshal([]byte(inData), obj)
if err != nil {
return err
}
//logger.Debug("json Unmarshal: \n", obj)
}
return nil
}
// ConvertToOutput - grpc 메시지를 출력포맷으로 변환
func ConvertToOutput(outType string, obj interface{}) (string, error) {
//logger := logger.NewLogger()
if outType == "yaml" {
// 메시지 포맷에서 불필요한 필드(XXX_로 시작하는 필드)를 제거하기 위해 json 태그를 이용하여 마샬링
j, err := json.Marshal(obj)
if err != nil {
return "", err
}
// yaml 에서 지원하지 않는 control character 제거
cleanStr := strings.Map(func(value rune) rune {
switch {
case value == 0x09:
return value
case value == 0x0A:
return value
case value == 0x0D:
return value
case value >= 0x20 && value <= 0x7E:
return value
case value == 0x85:
return value
case value >= 0xA0 && value <= 0xD7FF:
return value
case value >= 0xE000 && value <= 0xFFFD:
return value
case value >= 0x10000 && value <= 0x10FFFF:
return value
default:
return -1 // control characters are not allowed
}
}, string(j))
// 필드를 소팅하지 않고 지정된 순서대로 출력하기 위해 MapSlice 이용
jsonObj := yaml.MapSlice{}
err2 := yaml.Unmarshal([]byte(cleanStr), &jsonObj)
if err2 != nil {
return "", err2
}
// yaml 마샬링
y, err3 := yaml.Marshal(jsonObj)
if err3 != nil {
return "", err3
}
//logger.Debug("yaml Marshal: \n", string(y))
return string(y), nil
}
if outType == "json" {
j, err := json.MarshalIndent(obj, "", " ")
if err != nil {
return "", err
}
//logger.Debug("json Marshal: \n", string(j))
return string(j), nil
}
return "", nil
}
// CopySrcToDest - 소스에서 타켓으로 데이터 복사
func CopySrcToDest(src interface{}, dest interface{}) error {
//logger := logger.NewLogger()
j, err := json.MarshalIndent(src, "", " ")
if err != nil {
return err
}
//logger.Debug("source value : \n", string(j))
err = json.Unmarshal(j, dest)
if err != nil {
return err
}
j, err = json.MarshalIndent(dest, "", " ")
if err != nil {
return err
}
//logger.Debug("target value : \n", string(j))
return nil
}