{{/*
    
    Find examples in the given JSON schema.

    Tries to find examples in the `examples` and `example` keys of the schema
    first.

    If it doesn't succeed, iterates through the properties and subproperties to
    collect their examples, to merge them into a complete example for the  whole
    object.

    Parameter: the JSON schema to extract the examples from.

*/}}

{{ $this_object := . }}
{{ $examples := slice }}

{{ if $this_object.examples }}
    {{/* This is an array of examples, we can just use it */}}
    {{ $examples = $this_object.examples }}
{{ else if $this_object.example }}
    {{ $examples = slice $this_object.example }}
{{ else }}
    {{/* Resolve the nested examples */}}
    {{ if eq $this_object.type "object" }}
        {{ $example := dict }}

        {{ range $key, $property := $this_object.properties}}
            {{ $this_property_examples := partial "json-schema/resolve-examples" $property }}
            {{/*
                It would be too complex to handle several nested examples,
                just use the first one.
            */}}
            {{ with index $this_property_examples 0 }}
                {{ $example = merge (dict $key .) $example }}
            {{ end }}
        {{ end }}

        {{/*
            Add the assembled example to the list if either (a) the example is
            non-empty, or (b) the object itself is meant to be empty (so an
            empty example is correct).
        */}}
        {{ if (or $example (not $this_object.properties)) }}
            {{ $examples = slice $example }}
        {{ end }}

    {{ else if eq $this_object.type "array" }}

        {{/* the "items" within an array can either be an object (where we have a
             list of items which match the schema), or a list (for tuple
             validation, where each item has a different schema).

             TODO: support tuple validation here.
        */}}
        {{ if reflect.IsMap $this_object.items }}
            {{ $items_examples := partial "json-schema/resolve-examples" $this_object.items }}
            {{/*
                It would be too complex to handle several nested examples,
                just use the first one.
            */}}
            {{ with index $items_examples 0 }}
                {{ $examples = slice (slice .) }}
            {{ end }}
        {{ end }}
    {{ end }}

{{ end }}

{{ return $examples }}
