Fix rendering of array with items using anyOf

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
This commit is contained in:
Kévin Commaille 2024-06-20 13:01:57 +02:00
parent 27e71fff10
commit 5a83ac78f2
No known key found for this signature in database
GPG key ID: 0C971D9DBC9D678D
2 changed files with 14 additions and 2 deletions

View file

@ -155,6 +155,7 @@
{{ if eq $this_object.type "array" }} {{ if eq $this_object.type "array" }}
/* Add any nested objects referenced in this object's `items` */ /* Add any nested objects referenced in this object's `items` */
{{ if $this_object.items.anyOf }} {{ if $this_object.items.anyOf }}
{{ $updated_schemas := slice }}
{{ range $idx, $item := $this_object.items.anyOf }} {{ range $idx, $item := $this_object.items.anyOf }}
{{ $res := partial "get-additional-objects" (dict {{ $res := partial "get-additional-objects" (dict
"this_object" $item "this_object" $item
@ -163,7 +164,10 @@
"name" (printf "%s.items[%d]" $name $idx) "name" (printf "%s.items[%d]" $name $idx)
) }} ) }}
{{ $all_objects = $res.objects }} {{ $all_objects = $res.objects }}
{{ $updated_schemas = $updated_schemas | append $res.schema }}
{{ end }} {{ end }}
/* Update the top-level schema with the updated subschemas for the items */
{{ $this_object = merge $this_object (dict "items" (dict "anyOf" $updated_schemas)) }}
{{ else if reflect.IsMap $this_object.items}} {{ else if reflect.IsMap $this_object.items}}
{{ $res := partial "get-additional-objects" (dict {{ $res := partial "get-additional-objects" (dict
"this_object" $this_object.items "this_object" $this_object.items

View file

@ -117,6 +117,9 @@ resolve-additional-types.)
* `oneOf`: optional array of dictionaries describing the different formats * `oneOf`: optional array of dictionaries describing the different formats
that the property can have that the property can have
* `anyOf`: optional array of dictionaries describing the different formats
that the property can have
* `properties`: if the type is an object, optional dictionary for * `properties`: if the type is an object, optional dictionary for
well-defined properties, each given as: `property_name` : `property_data` well-defined properties, each given as: `property_name` : `property_data`
@ -158,13 +161,14 @@ resolve-additional-types.)
{{ $type = . }} {{ $type = . }}
{{ end }} {{ end }}
{{ end }} {{ end }}
{{ else if or (reflect.IsSlice .type) .oneOf }} {{ else if or (reflect.IsSlice .type) .oneOf .anyOf }}
{{/* {{/*
It's legal to specify an array of types. It's legal to specify an array of types.
There are two ways to do that: There are three ways to do that:
- Use an array of strings. - Use an array of strings.
- Use oneOf, with items having a schema. - Use oneOf, with items having a schema.
- Use anyOf, with items having a schema.
Join them together in that case, like `type|other_type`. Join them together in that case, like `type|other_type`.
*/}} */}}
@ -174,6 +178,10 @@ resolve-additional-types.)
{{ range .oneOf }} {{ range .oneOf }}
{{ $types = $types | append (partial "property-type" .) }} {{ $types = $types | append (partial "property-type" .) }}
{{ end }} {{ end }}
{{ else if .anyOf }}
{{ range .anyOf }}
{{ $types = $types | append (partial "property-type" .) }}
{{ end }}
{{ else }} {{ else }}
{{ range .type }} {{ range .type }}
{{ $types = $types | append (htmlEscape .) }} {{ $types = $types | append (htmlEscape .) }}