///|
/// moon_zod Schema Generator — JSON to `@moon_zod` source code
///
/// Accepts a JSON string via CLI argument and generates the
/// corresponding moon_zod schema expression.
///
/// Usage:
/// moon run cmd/json2schema -- ''
/// sh cmd/json2schema/cli.sh --file
/// moon run cmd/json2schema -- --help
fn main {
let args = @env.args()
if args.length() < 2 || has_flag(args, "--help") || has_flag(args, "-h") {
print_help()
return
}
let verbose = has_flag(args, "--verbose") || has_flag(args, "-v")
let from_json_schema = has_flag(args, "--from-json-schema")
if from_json_schema {
match last_value_arg(args) {
None => {
println("Error: missing JSON Schema argument")
println(
"Usage: moon run cmd/json2schema -- --from-json-schema ''",
)
return
}
Some(raw) => {
let json = @json.parse(raw) catch {
_ => {
println("Error: invalid JSON Schema")
println("Use --help for usage information.")
return
}
}
let code = @moon_zod.json_schema_to_moon_zod(json)
print_result(json, code, verbose, "Input JSON Schema")
return
}
}
}
match last_value_arg(args) {
None => {
println("Error: missing JSON argument")
return
}
Some(raw) => {
let json = @json.parse(raw) catch {
_ => {
println("Error: invalid JSON")
println(
"Note: wrap JSON in single quotes to prevent shell interpretation.",
)
println("Use --help for usage information.")
return
}
}
let schema = @moon_zod.json_infer_schema(json)
let code = @moon_zod.schema_to_moon_zod_code(schema)
print_result(json, code, verbose, "Input JSON")
}
}
}
///|
fn print_help() -> Unit {
println("Usage:")
println(" moon run cmd/json2schema -- ''")
println(" moon run cmd/json2schema -- --from-json-schema ''")
println(" moon run cmd/json2schema -- --verbose ''")
println(" sh cmd/json2schema/cli.sh --file ")
println(" sh cmd/json2schema/cli.sh --from-json-schema --file ")
println("")
println("Default output is copy-paste ready moon_zod code.")
println("Use --verbose to also print the parsed input.")
}
///|
fn has_flag(args : Array[String], flag : String) -> Bool {
for arg in args {
if arg == flag {
return true
}
}
false
}
///|
fn last_value_arg(args : Array[String]) -> String? {
let mut result : String? = None
for i = 1; i < args.length(); i = i + 1 {
let arg = args[i]
if arg.has_prefix("-") {
()
} else {
result = Some(arg)
}
}
result
}
///|
fn print_result(
json : Json,
code : String,
verbose : Bool,
input_label : String,
) -> Unit {
if verbose {
println("── " + input_label + " ──")
println(@debug.to_string(json))
println("")
println("── Generated moon_zod Schema ──")
}
println(code)
}