///|
/// SQL DDL → moonorm model + typed CRUD (goctl's `model mysql ddl`). `parse_ddl`
/// reads `CREATE TABLE` statements — column types, primary keys, `NOT NULL`, and
/// `DEFAULT` — and `generate_crud_from_ddl` emits, per table, the record struct, a
/// `@moonorm.Model`, an up/down migration, and parameterised CRUD: `insert`/`all`
/// always, plus `find_by_id`/`update`/`delete_by_id` when a table has a single-
/// column primary key (`users` does; `events` has none, so it gets only the pair).
///
///     moon run src/examples/05-ddl-crud
#coverage.skip
fn main {
  let source =
    #|CREATE TABLE users (
    #|  id     INTEGER PRIMARY KEY,
    #|  name   TEXT NOT NULL,
    #|  email  TEXT,
    #|  age    INTEGER DEFAULT 233,
    #|  active BOOLEAN DEFAULT 1
    #|);
    #|
    #|CREATE TABLE events (
    #|  ts      BIGINT NOT NULL,
    #|  payload BLOB,
    #|  score   REAL
    #|);
  let tables = @moonctl.parse_ddl(source)
  for t in tables {
    let cols = t.columns.map(fn(c) { c.name + ":" + c.type_ })
    println("table \{t.name} (\{cols.length()} cols): \{cols.join(", ")}")
  }
  println("\n==== generate_crud(parse_ddl(sql)) -> moonorm model + CRUD ====\n")
  let crud = @moonctl.generate_crud(tables)
  println(crud)

  // generate_crud_from_ddl is the one-step form: parse_ddl then generate_crud.
  println(
    "generate_crud(tables) == generate_crud_from_ddl(sql): \{crud == @moonctl.generate_crud_from_ddl(source)}",
  )
}