-
Notifications
You must be signed in to change notification settings - Fork 0
/
update_cs.go
125 lines (119 loc) · 3.85 KB
/
update_cs.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
package model
import (
"github.com/juxuny/yc/services"
"github.com/juxuny/yc/utils"
"github.com/juxuny/yc/utils/template"
"github.com/yoheimuta/go-protoparser/v4"
"github.com/yoheimuta/go-protoparser/v4/parser"
"log"
"os"
"path"
"reflect"
"strings"
)
// genCsModel generate c-sharper model file
func (t *UpdateCommand) genCsModel(service services.ServiceEntity) {
protoFile := t.getProtoFileName(service)
log.Println("parsing proto file: ", protoFile)
reader, err := os.Open(protoFile)
if err != nil {
log.Fatal("parse proto failed: ", err)
}
defer reader.Close()
result, err := protoparser.Parse(reader)
if err != nil {
log.Fatal(err)
}
messages := make([]*parser.Message, 0)
internalDataType := make(map[string]bool)
for _, item := range result.ProtoBody {
switch it := item.(type) {
case *parser.Enum:
internalDataType[it.EnumName] = true
case *parser.Message:
internalDataType[it.MessageName] = true
messages = append(messages, it)
}
}
refMap := make(map[string][]services.RefModel)
for _, m := range messages {
refModel, found := getRefFromMessageOfProto(m)
if found {
refMap[refModel] = append(refMap[refModel], t.createRefModelFromMessageOfProto(service, m, internalDataType))
}
}
for _, m := range messages {
if strings.Index(m.MessageName, "Model") == 0 {
t.createCSharpModel(service, m, internalDataType, refMap)
}
}
}
func (t *UpdateCommand) genCsEnum(service services.ServiceEntity) {
protoFile := t.getProtoFileName(service)
log.Println("parsing proto file: ", protoFile)
reader, err := os.Open(protoFile)
if err != nil {
log.Fatal("parse proto failed: ", err)
}
defer reader.Close()
result, err := protoparser.Parse(reader)
if err != nil {
log.Fatal(err)
}
enums := make([]*parser.Enum, 0)
for _, item := range result.ProtoBody {
switch it := item.(type) {
case *parser.Enum:
enums = append(enums, it)
}
}
for _, m := range enums {
if strings.Index(m.EnumName, "Enum") == 0 {
t.createCSharpEnum(service, m)
}
}
}
func (t *UpdateCommand) getCsEnumFields(enumName string, enum *parser.Enum) []services.EnumField {
ret := make([]services.EnumField, 0)
for _, item := range enum.EnumBody {
switch item.(type) {
case *parser.EnumField:
enumField := item.(*parser.EnumField)
ret = append(ret, services.EnumField{
FieldName: strings.Replace(enumField.Ident, enumName, "", 1),
Value: enumField.Number,
Desc: services.GetDescFromFieldCommentsOfProto(enumField.Comments),
})
default:
log.Println("unknown type:", reflect.TypeOf(item).String())
}
}
return ret
}
func (t *UpdateCommand) createCSharpEnum(service services.ServiceEntity, enum *parser.Enum) {
log.Println("create enum:", utils.ToUnderLine(enum.EnumName))
outEnumFile := path.Join(t.ModelOutputDir, enum.EnumName+".cs")
enumEntity := services.EnumEntity{
ServiceEntity: service,
EnumName: enum.EnumName,
Fields: t.getCsEnumFields(enum.EnumName, enum),
Desc: services.GetDescFromFieldCommentsOfProto(enum.Comments),
CSharpNamespace: t.CSharpModelNamespace,
}
if err := template.RunEmbedFile(templateFs, csEnumFileName, outEnumFile, enumEntity); err != nil {
log.Fatal(err)
}
}
func (t *UpdateCommand) createCSharpModel(service services.ServiceEntity, msg *parser.Message, internalDataType map[string]bool, refMap map[string][]services.RefModel) {
log.Println("create model:", utils.ToUnderLine(msg.MessageName))
outModelFile := path.Join(t.ModelOutputDir, msg.MessageName+".cs")
model := services.ModelEntity{
ServiceEntity: service,
CSharpModelNamespace: t.CSharpModelNamespace,
CSharpBaseNamespace: t.CSharpBaseNamespace,
Model: t.createModelFromMessageOfProto(service, msg, internalDataType, refMap[msg.MessageName]),
}
if err := template.RunEmbedFile(templateFs, csModelFileName, outModelFile, model); err != nil {
log.Fatal(err)
}
}