schema.ruprizzle parser.
The public surface is deliberately one function, [parse]. Everything else —
the Pest grammar, the loose AST, the five lowering passes, the validation rule
table — is an implementation detail behind it. That narrowness is what makes
replacing the parser a contained change rather than a schedule risk (see the
fallback note in ImplPlan02SchemaDslParser.md).
let schema = parse
.expect;
assert_eq!;
Errors accumulate: one call reports every problem it can find, each with a span and a suggested fix.