///| fn main raise { let app = @cmder.cli( name="myapp", version="0.1.0", description="Example CLI with nested subcommands", commands=[ @cmder.command( name="greet", description="Greet someone", options=[ @cmder.string( "name", short='n', description="Name to greet", required=true, ), @cmder.bool("loud", short='l', description="Shout the greeting"), @cmder.int("count", short='c', description="Repeat count", default=1), ], examples=[ "myapp greet --name Alice", "myapp greet --name Bob --loud --count 3", ], run=ctx => { let name = ctx.get_string_required("name") let loud = ctx.get_bool("loud") let count = ctx.get_int_required("count") for _ in 0.. { let dry = ctx.get_bool("dry-run") let steps = ctx.get_int("steps") if dry { println("[DRY RUN] Would apply migrations") } else { match steps { Some(n) => println("Applying \{n} migrations...") None => println("Applying all pending migrations...") } } println("Done.") }, ), @cmder.command( name="down", description="Rollback migrations", options=[ @cmder.int( "steps", short='s', description="Number of migrations to rollback", default=1, ), ], run=ctx => { let steps = ctx.get_int_required("steps") println("Rolling back \{steps} migration(s)...") println("Done.") }, ), ]), @cmder.command( name="seed", description="Seed the database", options=[ @cmder.string( "file", short='f', description="Seed file path", default="seeds/default.sql", ), ], run=ctx => { let file = ctx.get_string_required("file") println("Seeding from: \{file}") }, ), ]), ], ) // --schema flag: output structured JSON and exit let args = @env.args() if args.length() > 0 && args[args.length() - 1] == "--schema" { println(app.render_schema()) return } app.run_or_exit() }