exec cue def foo.cue -o openapi+cue:out.cue
cmp out.cue expect-out.cue

exec cue def openapi+cue: expect-cue-out -o -

exec cue def foo.cue -o openapi:-
cmp stdout expect-json-out

exec cue def foo.cue -o openapi+cue:-
cmp stdout expect-cue-out

exec cue def foo.cue -o openapi+yaml:-
cmp stdout expect-yaml-out

exec cue def -p foo openapi: openapi.json
cmp stdout expect-cue

# auto mode
exec cue def -p foo openapi.json
cmp stdout expect-cue

# cue to openapi
exec cue def openapi+cue: expect-cue-out -o -
cmp stdout expect-cue2

# combine
exec cue def -p foo openapi.json openapi2.json
cmp stdout expect-cue3

-- foo.cue --
// Some clever title.

$version: "v1"

#Foo: {
    a: int
    b: uint & <10
}

#Bar: {
    foo: #Foo
}

-- openapi.json --
{
    "openapi": "3.0.0",
    "info": {
        "title":   "My OpenAPI",
        "version": "v1alpha1"
    },
    "paths": {},
    "components": {
        "schemas": {
            "Bar": {
                "type": "object",
                "required": [
                    "foo"
                ],
                "x-ignored": "something",
                "properties": {
                    "foo": {
                        "$ref": "#/components/schemas/Foo"
                    }
                }
            },
            "Foo": {
                "type": "object",
                "required": [
                    "a",
                    "b"
                ],
                "properties": {
                    "a": {
                        "type": "integer"
                    },
                    "b": {
                        "type": "integer",
                        "minimum": 0,
                        "exclusiveMaximum": 10
                    }
                }
            }
        }
    }
}
-- openapi2.json --
{
    "openapi": "3.0.0",
    "info": {
        "title":   "My OpenAPI2",
        "version": "v1alpha1"
    },
    "paths": {},
    "components": {
        "schemas": {
            "Baz": {
                "type": "object",
                "required": [
                    "a",
                    "b"
                ],
                "properties": {
                    "a": {
                        "type": "integer"
                    },
                    "b": {
                        "type": "integer",
                        "minimum": 0,
                        "exclusiveMaximum": 10
                    }
                }
            }
        }
    }
}
-- expect-json-out --
{
    "openapi": "3.0.0",
    "info": {
        "title": "Some clever title.",
        "version": "v1"
    },
    "paths": {},
    "components": {
        "schemas": {
            "Bar": {
                "type": "object",
                "required": [
                    "foo"
                ],
                "properties": {
                    "foo": {
                        "$ref": "#/components/schemas/Foo"
                    }
                }
            },
            "Foo": {
                "type": "object",
                "required": [
                    "a",
                    "b"
                ],
                "properties": {
                    "a": {
                        "type": "integer"
                    },
                    "b": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 10,
                        "exclusiveMaximum": true
                    }
                }
            }
        }
    }
}
-- expect-yaml-out --
openapi: 3.0.0
info:
  title: Some clever title.
  version: v1
paths: {}
components:
  schemas:
    Bar:
      type: object
      required:
        - foo
      properties:
        foo:
          $ref: '#/components/schemas/Foo'
    Foo:
      type: object
      required:
        - a
        - b
      properties:
        a:
          type: integer
        b:
          type: integer
          minimum: 0
          maximum: 10
          exclusiveMaximum: true
-- expect-cue-out --
openapi: "3.0.0"
info: {
	title:   "Some clever title."
	version: "v1"
}
paths: {}
components: schemas: {
	Bar: {
		type: "object"
		required: ["foo"]
		properties: foo: $ref: "#/components/schemas/Foo"
	}
	Foo: {
		type: "object"
		required: ["a", "b"]
		properties: {
			a: type: "integer"
			b: {
				type:             "integer"
				minimum:          0
				maximum:          10
				exclusiveMaximum: true
			}
		}
	}
}
-- expect-cue --
// My OpenAPI
package foo

info: {
	title:   *"My OpenAPI" | string
	version: *"v1alpha1" | string
}
#Bar: {
	foo!: #Foo
	...
}
#Foo: {
	a!: int
	b!: uint & <10
	...
}
-- expect-cue2 --
info: {
	title:   *"Some clever title." | string
	version: *"v1" | string
}
#Bar: {
	foo!: #Foo
	...
}
#Foo: {
	a!: int
	b!: uint & <10
	...
}
-- expect-cue3 --
// My OpenAPI
//
// My OpenAPI2
package foo

info: {
	title:   (*"My OpenAPI" | string) & (*"My OpenAPI2" | string)
	version: (*"v1alpha1" | string) & (*"v1alpha1" | string)
}
#Bar: {
	foo!: #Foo
	...
}
#Foo: {
	a!: int
	b!: uint & <10
	...
}
#Baz: {
	a!: int
	b!: uint & <10
	...
}
-- expect-out.cue --
openapi: "3.0.0"
info: {
	title:   "Some clever title."
	version: "v1"
}
paths: {}
components: schemas: {
	Bar: {
		type: "object"
		required: ["foo"]
		properties: foo: $ref: "#/components/schemas/Foo"
	}
	Foo: {
		type: "object"
		required: ["a", "b"]
		properties: {
			a: type: "integer"
			b: {
				type:             "integer"
				minimum:          0
				maximum:          10
				exclusiveMaximum: true
			}
		}
	}
}
