5151 skipStructs = map [string ]bool {
5252 "Client" : true ,
5353 }
54+
55+ // whitelistSliceGetters lists "struct.field" to add getter method
56+ whitelistSliceGetters = map [string ]bool {
57+ "PushEvent.Commits" : true ,
58+ }
5459)
5560
5661func logf (fmt string , args ... interface {}) {
@@ -137,6 +142,13 @@ func (t *templateData) processAST(f *ast.File) error {
137142 case * ast.MapType :
138143 t .addMapType (x , ts .Name .String (), fieldName .String (), false )
139144 continue
145+ case * ast.ArrayType :
146+ if key := fmt .Sprintf ("%v.%v" , ts .Name , fieldName ); whitelistSliceGetters [key ] {
147+ logf ("Method %v is whitelist; adding getter method." , key )
148+ t .addArrayType (x , ts .Name .String (), fieldName .String (), false )
149+ continue
150+ }
151+ continue
140152 }
141153
142154 logf ("Skipping field type %T, fieldName=%v" , field .Type , fieldName )
@@ -145,7 +157,7 @@ func (t *templateData) processAST(f *ast.File) error {
145157
146158 switch x := se .X .(type ) {
147159 case * ast.ArrayType :
148- t .addArrayType (x , ts .Name .String (), fieldName .String ())
160+ t .addArrayType (x , ts .Name .String (), fieldName .String (), true )
149161 case * ast.Ident :
150162 t .addIdent (x , ts .Name .String (), fieldName .String ())
151163 case * ast.MapType :
@@ -218,17 +230,26 @@ func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct
218230 }
219231}
220232
221- func (t * templateData ) addArrayType (x * ast.ArrayType , receiverType , fieldName string ) {
233+ func (t * templateData ) addArrayType (x * ast.ArrayType , receiverType , fieldName string , isAPointer bool ) {
222234 var eltType string
235+ var ng * getter
223236 switch elt := x .Elt .(type ) {
224237 case * ast.Ident :
225238 eltType = elt .String ()
239+ ng = newGetter (receiverType , fieldName , "[]" + eltType , "nil" , false )
240+ case * ast.StarExpr :
241+ ident , ok := elt .X .(* ast.Ident )
242+ if ! ok {
243+ return
244+ }
245+ ng = newGetter (receiverType , fieldName , "[]*" + ident .String (), "nil" , false )
226246 default :
227247 logf ("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping." , receiverType , fieldName , elt , elt )
228248 return
229249 }
230250
231- t .Getters = append (t .Getters , newGetter (receiverType , fieldName , "[]" + eltType , "nil" , false ))
251+ ng .ArrayType = ! isAPointer
252+ t .Getters = append (t .Getters , ng )
232253}
233254
234255func (t * templateData ) addIdent (x * ast.Ident , receiverType , fieldName string ) {
@@ -322,6 +343,7 @@ type getter struct {
322343 ZeroValue string
323344 NamedStruct bool // Getter for named struct.
324345 MapType bool
346+ ArrayType bool
325347}
326348
327349type byName []* getter
@@ -356,8 +378,8 @@ func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} {
356378 }
357379 return {{.ReceiverVar}}.{{.FieldName}}
358380}
359- {{else if .MapType}}
360- // Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise.
381+ {{else if or .MapType .ArrayType }}
382+ // Get{{.FieldName}} returns the {{.FieldName}} {{if .MapType}} map{{else if .ArrayType }}slice{{end}} if it's non-nil, {{if .MapType}} an empty map{{else if .ArrayType }}nil{{end}} otherwise.
361383func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
362384 if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
363385 return {{.ZeroValue}}
@@ -402,7 +424,7 @@ func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
402424 {{.ReceiverVar}} = nil
403425 {{.ReceiverVar}}.Get{{.FieldName}}()
404426}
405- {{else if .MapType}}
427+ {{else if or .MapType .ArrayType }}
406428func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
407429 zeroValue := {{.FieldType}}{}
408430 {{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: zeroValue }
0 commit comments