@@ -12,6 +12,7 @@ import (
12
12
13
13
"github.com/fatih/structtag"
14
14
"github.com/iancoleman/strcase"
15
+ "golang.org/x/xerrors"
15
16
)
16
17
17
18
func main () {
@@ -87,9 +88,26 @@ func traverse(pkg *ast.Package, fs *token.FileSet, structName string) error {
87
88
return fmt .Errorf ("no such struct: %s" , structName )
88
89
}
89
90
91
+ func uppercaseExtraction (name string ) (lower string ) {
92
+ for _ , x := range name {
93
+ if 65 <= x && x <= 90 {
94
+ lower += string (x + 32 )
95
+ }
96
+ }
97
+ return
98
+ }
99
+
100
+ const queryLabel = "QueryLabel"
101
+
90
102
func generate (gen * generator , fs * token.FileSet , structType * ast.StructType ) error {
103
+ dupMap := make (map [string ]int )
104
+ filedLabel := gen .StructName + queryLabel
91
105
for _ , field := range structType .Fields .List {
92
106
// structの各fieldを調査
107
+ if len (field .Names ) != 1 {
108
+ return xerrors .New ("`field.Names` must have only one element" )
109
+ }
110
+ name := field .Names [0 ].Name
93
111
94
112
if field .Tag == nil {
95
113
continue
@@ -102,7 +120,7 @@ func generate(gen *generator, fs *token.FileSet, structType *ast.StructType) err
102
120
if err != nil {
103
121
log .Printf (
104
122
"%s: tag for %s in struct %s in %s" ,
105
- pos , field . Names [ 0 ]. Name , gen .StructName , gen .GeneratedFileName + ".go" ,
123
+ pos , name , gen .StructName , gen .GeneratedFileName + ".go" ,
106
124
)
107
125
108
126
continue
@@ -111,6 +129,19 @@ func generate(gen *generator, fs *token.FileSet, structType *ast.StructType) err
111
129
_ , err = tags .Get ("datastore_key" )
112
130
113
131
if err != nil {
132
+ u := uppercaseExtraction (name )
133
+ if _ , ok := dupMap [u ]; ! ok {
134
+ dupMap [u ] = 1
135
+ } else {
136
+ dupMap [u ]++
137
+ u = fmt .Sprintf ("%s%d" , u , dupMap [u ])
138
+ }
139
+ idx := IndexesInfo {
140
+ Field : filedLabel + name ,
141
+ Label : u ,
142
+ }
143
+ idx .Comment = fmt .Sprintf ("%s %s" , idx .Field , name ) // TODO `前方一致` や `部分一致` など
144
+ gen .ConstMapForIndexes = append (gen .ConstMapForIndexes , idx )
114
145
continue
115
146
}
116
147
@@ -125,7 +156,7 @@ func generate(gen *generator, fs *token.FileSet, structType *ast.StructType) err
125
156
return fmt .Errorf ("%s: datastore_key tag can be set to only one field" , pos )
126
157
}
127
158
128
- gen .KeyFieldName = field . Names [ 0 ]. Name
159
+ gen .KeyFieldName = name
129
160
gen .KeyFieldType = getTypeName (field .Type )
130
161
131
162
if gen .KeyFieldType != "int64" &&
@@ -134,20 +165,38 @@ func generate(gen *generator, fs *token.FileSet, structType *ast.StructType) err
134
165
return fmt .Errorf ("%s: supported key types are int64, string, *datastore.Key" , pos )
135
166
}
136
167
137
- gen .KeyValueName = strcase .ToLowerCamel (field . Names [ 0 ]. Name )
168
+ gen .KeyValueName = strcase .ToLowerCamel (name )
138
169
}
139
170
140
- fp , err := os .Create (gen .GeneratedFileName + ".go" )
171
+ {
172
+ fp , err := os .Create (gen .GeneratedFileName + ".go" )
173
+ if err != nil {
174
+ panic (err )
175
+ }
176
+ defer fp .Close ()
141
177
142
- if err != nil {
143
- panic (err )
178
+ gen .generate (fp )
144
179
}
145
180
146
- gen .generate (
147
- fp ,
148
- )
149
-
150
- fp .Close ()
181
+ {
182
+ if ! exists ("configs" ) {
183
+ if err := os .Mkdir ("configs" , 0777 ); err != nil {
184
+ return err
185
+ }
186
+ }
187
+ path := "configs/" + strcase .ToLowerCamel (gen .StructName ) + "_const.go"
188
+ fp , err := os .Create (path )
189
+ if err != nil {
190
+ panic (err )
191
+ }
192
+ defer fp .Close ()
193
+ gen .generateConstant (fp )
194
+ }
151
195
152
196
return nil
153
197
}
198
+
199
+ func exists (filename string ) bool {
200
+ _ , err := os .Stat (filename )
201
+ return err == nil
202
+ }
0 commit comments