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,12 @@ 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+ }
140151 }
141152
142153 logf ("Skipping field type %T, fieldName=%v" , field .Type , fieldName )
@@ -145,7 +156,7 @@ func (t *templateData) processAST(f *ast.File) error {
145156
146157 switch x := se .X .(type ) {
147158 case * ast.ArrayType :
148- t .addArrayType (x , ts .Name .String (), fieldName .String ())
159+ t .addArrayType (x , ts .Name .String (), fieldName .String (), true )
149160 case * ast.Ident :
150161 t .addIdent (x , ts .Name .String (), fieldName .String ())
151162 case * ast.MapType :
@@ -218,17 +229,26 @@ func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct
218229 }
219230}
220231
221- func (t * templateData ) addArrayType (x * ast.ArrayType , receiverType , fieldName string ) {
232+ func (t * templateData ) addArrayType (x * ast.ArrayType , receiverType , fieldName string , isAPointer bool ) {
222233 var eltType string
234+ var ng * getter
223235 switch elt := x .Elt .(type ) {
224236 case * ast.Ident :
225237 eltType = elt .String ()
238+ ng = newGetter (receiverType , fieldName , "[]" + eltType , "nil" , false )
239+ case * ast.StarExpr :
240+ ident , ok := elt .X .(* ast.Ident )
241+ if ! ok {
242+ return
243+ }
244+ ng = newGetter (receiverType , fieldName , "[]*" + ident .String (), "nil" , false )
226245 default :
227246 logf ("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping." , receiverType , fieldName , elt , elt )
228247 return
229248 }
230249
231- t .Getters = append (t .Getters , newGetter (receiverType , fieldName , "[]" + eltType , "nil" , false ))
250+ ng .ArrayType = ! isAPointer
251+ t .Getters = append (t .Getters , ng )
232252}
233253
234254func (t * templateData ) addIdent (x * ast.Ident , receiverType , fieldName string ) {
@@ -322,6 +342,7 @@ type getter struct {
322342 ZeroValue string
323343 NamedStruct bool // Getter for named struct.
324344 MapType bool
345+ ArrayType bool
325346}
326347
327348type byName []* getter
@@ -356,8 +377,8 @@ func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} {
356377 }
357378 return {{.ReceiverVar}}.{{.FieldName}}
358379}
359- {{else if .MapType}}
360- // Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise.
380+ {{else if or .MapType .ArrayType }}
381+ // 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.
361382func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
362383 if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
363384 return {{.ZeroValue}}
@@ -402,7 +423,7 @@ func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
402423 {{.ReceiverVar}} = nil
403424 {{.ReceiverVar}}.Get{{.FieldName}}()
404425}
405- {{else if .MapType}}
426+ {{else if or .MapType .ArrayType }}
406427func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) {
407428 zeroValue := {{.FieldType}}{}
408429 {{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: zeroValue }
0 commit comments