#skip-v3
#skip-v3-noshare
-- in.cue --
// An OpenAPI testing package.
package openapi

$version: "v1beta2"

info: {
	contact: url:  "https://cuelang.org"
	contact: name: "John Doe"
}

// MyMessage is my message.
#MyMessage: {
	port?: #Port & {} @protobuf(1)

	foo: #Int32 & >10 & <1000 & int32 @protobuf(2)

	bar: [...string] @protobuf(3)
}

#MyMessage: {
	// Field a.
	a: 1
} | {
	b: string //2: crash
}

#YourMessage: ({a: number} | {b: string} | {b: number}) & {a?: string}

#YourMessage2: ({a: number} | {b: number}) &
	({c: number} | {d: number}) &
	({e: number} | {f: number})

#Msg2: {b: number} | {a: string}

#Int32: int32

#Enum: "foo" | "bar" | "baz"

#List: [...number] | *[1, 2, 3]

#DefaultStruct: #Port | *{port: 1}

#Port: {
	port: int

	obj: [...int]
}

-- out/TestGenerateOpenAPI/out.json --
{
   "openapi": "3.0.0",
   "info": {
      "contact": {
         "url": "https://cuelang.org",
         "name": "John Doe"
      },
      "title": "An OpenAPI testing package.",
      "version": "v1beta2"
   },
   "paths": {},
   "components": {
      "schemas": {
         "DefaultStruct": {
            "type": "object",
            "default": {
               "port": 1
            },
            "oneOf": [
               {
                  "$ref": "#/components/schemas/Port"
               },
               {
                  "required": [
                     "port"
                  ],
                  "properties": {
                     "port": {
                        "type": "integer",
                        "enum": [
                           1
                        ]
                     }
                  }
               }
            ]
         },
         "Enum": {
            "type": "string",
            "enum": [
               "foo",
               "bar",
               "baz"
            ]
         },
         "Int32": {
            "type": "integer",
            "format": "int32"
         },
         "List": {
            "type": "array",
            "items": {
               "type": "number"
            },
            "default": [
               1,
               2,
               3
            ]
         },
         "Msg2": {
            "type": "object",
            "oneOf": [
               {
                  "required": [
                     "b"
                  ],
                  "properties": {
                     "b": {
                        "type": "number"
                     }
                  }
               },
               {
                  "required": [
                     "a"
                  ],
                  "properties": {
                     "a": {
                        "type": "string"
                     }
                  }
               }
            ]
         },
         "MyMessage": {
            "description": "MyMessage is my message.",
            "type": "object",
            "required": [
               "foo",
               "bar"
            ],
            "properties": {
               "port": {
                  "type": "object",
                  "$ref": "#/components/schemas/Port"
               },
               "foo": {
                  "type": "integer",
                  "allOf": [
                     {
                        "$ref": "#/components/schemas/Int32"
                     },
                     {
                        "exclusiveMinimum": true,
                        "minimum": 10,
                        "exclusiveMaximum": true,
                        "maximum": 1000
                     }
                  ]
               },
               "bar": {
                  "type": "array",
                  "items": {
                     "type": "string"
                  }
               }
            },
            "oneOf": [
               {
                  "required": [
                     "a"
                  ],
                  "properties": {
                     "a": {
                        "description": "Field a.",
                        "type": "integer",
                        "enum": [
                           1
                        ]
                     }
                  }
               },
               {
                  "required": [
                     "b"
                  ],
                  "properties": {
                     "b": {
                        "type": "string"
                     }
                  }
               }
            ]
         },
         "Port": {
            "type": "object",
            "required": [
               "port",
               "obj"
            ],
            "properties": {
               "port": {
                  "type": "integer"
               },
               "obj": {
                  "type": "array",
                  "items": {
                     "type": "integer"
                  }
               }
            }
         },
         "YourMessage": {
            "type": "object",
            "properties": {
               "a": {
                  "type": "string"
               }
            },
            "oneOf": [
               {
                  "required": [
                     "a"
                  ],
                  "properties": {
                     "a": {
                        "type": "number"
                     }
                  }
               },
               {
                  "required": [
                     "b"
                  ],
                  "properties": {
                     "b": {
                        "type": "string"
                     }
                  }
               },
               {
                  "required": [
                     "b"
                  ],
                  "properties": {
                     "b": {
                        "type": "number"
                     }
                  }
               }
            ]
         },
         "YourMessage2": {
            "type": "object",
            "allOf": [
               {
                  "oneOf": [
                     {
                        "required": [
                           "a"
                        ],
                        "properties": {
                           "a": {
                              "type": "number"
                           }
                        }
                     },
                     {
                        "required": [
                           "b"
                        ],
                        "properties": {
                           "b": {
                              "type": "number"
                           }
                        }
                     }
                  ]
               },
               {
                  "oneOf": [
                     {
                        "required": [
                           "c"
                        ],
                        "properties": {
                           "c": {
                              "type": "number"
                           }
                        }
                     },
                     {
                        "required": [
                           "d"
                        ],
                        "properties": {
                           "d": {
                              "type": "number"
                           }
                        }
                     }
                  ]
               },
               {
                  "oneOf": [
                     {
                        "required": [
                           "e"
                        ],
                        "properties": {
                           "e": {
                              "type": "number"
                           }
                        }
                     },
                     {
                        "required": [
                           "f"
                        ],
                        "properties": {
                           "f": {
                              "type": "number"
                           }
                        }
                     }
                  ]
               }
            ]
         }
      }
   }
}