@@ -10,6 +10,7 @@ import (
1010 "net/url"
1111 "path"
1212 "reflect"
13+ "strconv"
1314 "strings"
1415
1516 "github.com/ghodss/yaml"
@@ -285,16 +286,25 @@ func (swaggerLoader *SwaggerLoader) resolveComponent(swagger *Swagger, ref strin
285286}
286287
287288func drillIntoSwaggerField (cursor interface {}, fieldName string ) (interface {}, error ) {
288- val := reflect .Indirect (reflect .ValueOf (cursor ))
289-
290- switch val .Kind () {
289+ switch val := reflect .Indirect (reflect .ValueOf (cursor )); val .Kind () {
291290 case reflect .Map :
292291 elementValue := val .MapIndex (reflect .ValueOf (fieldName ))
293292 if ! elementValue .IsValid () {
294293 return nil , fmt .Errorf ("Map key not found: %v" , fieldName )
295294 }
296295 return elementValue .Interface (), nil
297296
297+ case reflect .Slice :
298+ i , err := strconv .ParseUint (fieldName , 10 , 32 )
299+ if err != nil {
300+ return nil , err
301+ }
302+ index := int (i )
303+ if index >= val .Len () {
304+ return nil , errors .New ("slice index out of bounds" )
305+ }
306+ return val .Index (index ).Interface (), nil
307+
298308 case reflect .Struct :
299309 for i := 0 ; i < val .NumField (); i ++ {
300310 field := val .Type ().Field (i )
@@ -311,8 +321,10 @@ func drillIntoSwaggerField(cursor interface{}, fieldName string) (interface{}, e
311321 }
312322 // give up
313323 return nil , fmt .Errorf ("Struct field not found: %v" , fieldName )
324+
325+ default :
326+ return nil , errors .New ("not a map, slice nor struct" )
314327 }
315- return nil , errors .New ("Not a map or struct" )
316328}
317329
318330func (swaggerLoader * SwaggerLoader ) resolveRefSwagger (swagger * Swagger , ref string , path * url.URL ) (* Swagger , string , * url.URL , error ) {
0 commit comments