///|
/// From a `.api` spec to code, in one process — the pipeline the `mctl` binary
/// runs, minus the file IO. `parse` reads the spec, `generate` emits the moonapi
/// scaffold, `openapi_document` emits the matching OpenAPI 3.1 document. Pure
/// logic, so it runs on every backend.
///
/// moon run src/examples/00-greet
#coverage.skip
fn main raise {
let source =
#|type User {
#| id: int64
#| name: string
#|}
#|
#|type CreateUserReq {
#| name: string `json:"name"`
#|}
#|
#|service greet {
#| get /ping ping "health check"
#| get /users/:id get_user
#| post /users create_user "create a user"
#|}
let spec = @moonctl.parse(source)
println(
"parsed service \{spec.service}: \{spec.routes.length()} routes, \{spec.types.length()} types\n",
)
try {
let scaffold = @moonctl.generate(spec)
println("==== generate(spec) -> moonapi scaffold ====\n")
println(scaffold)
} catch {
_ => println("mctl: codegen failed")
}
let doc = @moonctl.openapi_document(spec, version=OpenApi31, title="greet").stringify(
indent=2,
)
println(
"==== openapi_document(spec, version=OpenApi31) -> OpenAPI 3.1 ====\n",
)
println(doc)
}