@@ -38,6 +38,9 @@ import (
3838const (
3939 // defPrefix is the prefix used to link to definitions in the OpenAPI schema.
4040 defPrefix = "#/definitions/"
41+
42+ // arrayType is the JSON schema type for arrays.
43+ arrayType = "array"
4144)
4245
4346// byteType is the types.Type for byte (see the types documention
@@ -201,7 +204,7 @@ func applyMarkers(ctx *schemaContext, markerSet markers.MarkerValues, props *api
201204 }
202205
203206 for _ , schemaMarker := range itemsMarkers {
204- if props .Type != "array" || props .Items == nil || props .Items .Schema == nil {
207+ if props .Type != arrayType || props .Items == nil || props .Items .Schema == nil {
205208 err := fmt .Errorf ("must apply %s to an array value, found %s" , schemaMarker .Name , props .Type )
206209 ctx .pkg .AddError (loader .ErrFromNode (err , node ))
207210 } else {
@@ -312,26 +315,31 @@ func localNamedToSchema(ctx *schemaContext, ident *ast.Ident) *apiextensionsv1.J
312315 ctx .requestSchema (pkgPath , typeNameInfo .Name ())
313316 link := TypeRefLink (pkgPath , typeNameInfo .Name ())
314317
318+ // For type aliases to slice/map types, include the underlying type information
319+ // so that markers like +listType can be applied at the field level.
320+ props := & apiextensionsv1.JSONSchemaProps {
321+ Ref : & link ,
322+ }
323+
315324 // In cases where we have a named type, apply the type and format from the named schema
316325 // to allow markers that need this information to apply correctly.
317- var typ , fmt string
318326 if namedInfo , isNamed := typeInfo .(* types.Named ); isNamed {
319- // We don't want/need to do this for structs, maps, or arrays.
320- // These are already handled in infoToSchema if they have custom marshalling.
321- if _ , isBasic := namedInfo .Underlying ().(* types.Basic ); isBasic {
327+ switch namedInfo .Underlying ().(type ) {
328+ case * types.Slice :
329+ props .Type = arrayType
330+ case * types.Map :
331+ props .Type = "object"
332+ case * types.Basic :
333+ // We don't want/need to do this for structs, maps, or arrays.
334+ // These are already handled in infoToSchema if they have custom marshalling.
322335 namedTypeInfo := ctx .schemaRequester .LookupType (ctx .pkg , namedInfo .Obj ().Name ())
323-
324336 namedSchema := infoToSchema (ctx .ForInfo (namedTypeInfo ))
325- typ = namedSchema .Type
326- fmt = namedSchema .Format
337+ props . Type = namedSchema .Type
338+ props . Format = namedSchema .Format
327339 }
328340 }
329341
330- return & apiextensionsv1.JSONSchemaProps {
331- Type : typ ,
332- Format : fmt ,
333- Ref : & link ,
334- }
342+ return props
335343 default :
336344 ctx .pkg .AddError (loader .ErrFromNode (fmt .Errorf ("unsupported type %T for identifier %s" , typeInfo , ident .Name ), ident ))
337345 return & apiextensionsv1.JSONSchemaProps {}
@@ -354,10 +362,19 @@ func namedToSchema(ctx *schemaContext, named *ast.SelectorExpr) *apiextensionsv1
354362 nonVendorPath := loader .NonVendorPath (typeNameInfo .Pkg ().Path ())
355363 ctx .requestSchema (nonVendorPath , typeNameInfo .Name ())
356364 link := TypeRefLink (nonVendorPath , typeNameInfo .Name ())
357- return & apiextensionsv1.JSONSchemaProps {
365+ // For type aliases to slice/map types, include the underlying type information
366+ // so that markers like +listType can be applied at the field level.
367+ props := & apiextensionsv1.JSONSchemaProps {
358368 Ref : & link ,
359369 }
370+ switch typeInfoRaw .Underlying ().(type ) {
371+ case * types.Slice :
372+ props .Type = arrayType
373+ case * types.Map :
374+ props .Type = "object"
375+ }
360376 // NB(directxman12): we special-case things like resource.Quantity during the "collapse" phase.
377+ return props
361378}
362379
363380// arrayToSchema creates a schema for the items of the given array, dealing appropriately
@@ -376,7 +393,7 @@ func arrayToSchema(ctx *schemaContext, array *ast.ArrayType) *apiextensionsv1.JS
376393 items := typeToSchema (ctx .ForInfo (& markers.TypeInfo {}), array .Elt )
377394
378395 return & apiextensionsv1.JSONSchemaProps {
379- Type : "array" ,
396+ Type : arrayType ,
380397 Items : & apiextensionsv1.JSONSchemaPropsOrArray {Schema : items },
381398 }
382399}
0 commit comments