///|
/// One set of typed routes, every mainstream spec version. `App::openapi_json`
/// emits Swagger 2.0, OpenAPI 3.0.3, and OpenAPI 3.1.0 off the same descriptors;
/// `App::openapi` additionally takes the document metadata (title, description,
/// contact, license, servers) and `swagger_ui` returns a ready docs page. The
/// widget app in `models.mbt` carries typed bodies, so the emitted specs show
/// `components` (`definitions` in 2.0) with `$ref`s.
///
///     moon run src/examples/03-openapi-versions
#coverage.skip
fn main {
  let app = widget_app()
  app.get(
    "/legacy",
    _ctx => @moonapi.text(200, "old"),
    summary="the legacy list",
    tags=["misc"],
    deprecated=true,
  )
  println("--- Swagger 2.0 (definitions) ---")
  println(app.openapi_json(version=Swagger20))
  println("--- OpenAPI 3.0.3 (components/schemas) ---")
  println(app.openapi_json(version=OpenApi30))
  println("--- OpenAPI 3.1.0 with full info metadata ---")
  let doc = app.openapi(
    version=OpenApi31,
    title="Widget API",
    api_version="2.3.0",
    description="a comprehensive moonapi example",
    contact=Some(
      @moonapi.Contact::new(name="lfanke", email="heke1228@example.com"),
    ),
    license=Some(@moonapi.License::new("Apache-2.0", identifier="Apache-2.0")),
    servers=[
      @moonapi.Server::new("https://api.example.com", description="production"),
    ],
  )
  println(doc.stringify(indent=2))
  println("swagger_ui page: \{@moonapi.swagger_ui().length()} bytes")
}