-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtemplate.go
115 lines (103 loc) · 2.39 KB
/
template.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
package main
import (
"bytes"
_ "embed"
"fmt"
"html/template"
"strings"
"unicode"
)
//go:embed template.go.tpl
var tpl string
type serviceDesc struct {
Name string // Greeter
FullName string // helloworld.Greeter
FilePath string // api/helloworld/helloworld.proto
Methods []*methodDesc // 方法列表
MethodSet map[string]*methodDesc // 方法映射表
}
type methodDesc struct {
// method
Name string
OriginalName string
HttpPathNum int
// message
Request *message
Response *message
// http
HasPathVars bool // 是否有参数
Path string // HTTP 路径
Method string // HTTP 动作
HasBody bool
RequestBody string // 暂时不知道干啥的
ResponseBody string // 暂时不知道干啥的
}
type message struct {
Name string
Fields []*field
}
type field struct {
Name string
Type string
}
func (s *serviceDesc) execute() string {
if s.MethodSet == nil {
s.MethodSet = map[string]*methodDesc{}
for _, m := range s.Methods {
m := m
s.MethodSet[m.Name] = m
}
}
buf := new(bytes.Buffer)
tmpl, err := template.New("http").Parse(strings.TrimSpace(tpl))
if err != nil {
panic(err)
}
if err := tmpl.Execute(buf, s); err != nil {
panic(err)
}
return buf.String()
}
// FunctionName for func name
func (m *methodDesc) FunctionName() string {
// 如果方法对应的接口数量大于0个就给方法名后面就上序号
if m.HttpPathNum > 0 {
return fmt.Sprintf("%s_%d", m.Name, m.HttpPathNum)
} else {
return m.Name
}
}
// 小驼峰
func (s *serviceDesc) LowerServiceName() string {
if len(s.Name) == 0 {
return s.Name
}
firstChar := strings.ToLower(string(s.Name[0]))
return firstChar + s.Name[1:]
}
// 横杠分割
func (s *serviceDesc) KebabCaseServiceName() string {
var result strings.Builder
for i, char := range s.Name {
if i > 0 && unicode.IsUpper(char) {
result.WriteRune('-')
}
result.WriteRune(unicode.ToLower(char))
}
return result.String()
}
// 下划线
func (s *serviceDesc) SnakeCaseServiceName() string {
var result strings.Builder
for i, char := range s.Name {
if i > 0 && unicode.IsUpper(char) {
result.WriteRune('_')
}
result.WriteRune(unicode.ToLower(char))
}
return result.String()
}
// isListMethod 判断是不是需要 list 接口
func (m *methodDesc) IsListMethod() bool {
return strings.ToLower(m.Name)[0:4] == "list"
}