protostostruct.go
2.8 KB
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
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"path"
)
var (
ProtoCode = "syntax = \"proto3\";\noption go_package = \"./pb;pb\";\n\npackage protocode;\n\nenum ProtoCode\n{\n UNKNOWN = 0x000;\n %s\n}"
ProtoCodeLine = "\t%sRpc = %02x;\n"
GoProtoCodeStr = "package main\n\nimport (\n\t\"pro2d/protos/pb\"\n\t\"pro2d/src/components/logger\"\n\t\"pro2d/src/components/net\"\n)\n\nfunc LoadRpc() {\n\tlogger.Debug(\"init protocode...\")\n\tnet.ActionMap = make(map[pb.ProtoCode]net.ActionHandler)\n%s\n}\n\nfunc init() {\n\tLoadRpc()\n}"
GoProtoCodeLine = "\tnet.ActionMap[pb.ProtoCode_%sRpc] = %sRpc\n"
)
func ProtoToCode(readPath, filename string) (string, string) {
protofile , err := os.Open(readPath+filename)
code := 0x000
protoData := ""
goProtoData := ""
if err != nil {
fmt.Errorf("ReadExcel|xlsx.OpenFile is err :%v", err)
return "", ""
}
defer protofile.Close()
r := bufio.NewReader(protofile)
for {
line, isPrefix, err := r.ReadLine()
if len(line) > 0 && err != nil {
fmt.Errorf("ReadLine returned both data and error: %s", err)
return "", ""
}
if isPrefix {
fmt.Errorf("ReadLine returned prefix")
return "", ""
}
if err != nil {
if err != io.EOF {
fmt.Errorf("Got unknown error: %s", err)
return "", ""
}
break
}
n := bytes.Index(line, []byte("message"))
if n < 0 {
continue
}
lb := bytes.Split(line, []byte(" "))
for _, v := range lb {
n = bytes.Index(v, []byte("Req"))
if n < 0 {
continue
}
code++
protoData += fmt.Sprintf(ProtoCodeLine, v[:n],code)
goProtoData += fmt.Sprintf(GoProtoCodeLine, v[:n], v[:n])
}
}
return protoData ,goProtoData
}
func ReadProtos(readPath, OutPath string ) error {
files, err := ioutil.ReadDir(readPath)
if err != nil {
return fmt.Errorf("ReadExcel|ReadDir is err:%v", err)
}
protoData, goProtoData := "", ""
for _, file := range files {
if path.Ext(file.Name()) != ".proto"{
continue
}
tprotoData, tgoProtoData := ProtoToCode(readPath, file.Name())
if tprotoData == "" || tgoProtoData == "" {
continue
}
protoData += tprotoData
goProtoData += tgoProtoData
}
fw, err := os.OpenFile( OutPath+"protos/protocode.proto", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return fmt.Errorf("WriteNewFile|OpenFile is err:%v", err)
}
defer fw.Close()
_, err = fw.Write([]byte(fmt.Sprintf(ProtoCode, protoData)))
if err != nil {
return fmt.Errorf("WriteNewFile|Write is err:%v", err)
}
fw, err = os.OpenFile( OutPath+"src/plugin/protocode.go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return fmt.Errorf("WriteNewFile|OpenFile is err:%v", err)
}
defer fw.Close()
_, err = fw.Write([]byte(fmt.Sprintf(GoProtoCodeStr, goProtoData)))
if err != nil {
return fmt.Errorf("WriteNewFile|Write is err:%v", err)
}
return nil
}