normalize.nct
use std/cli.Application
use std/fs
use std/io.BlockingWriter
use std/io
use std/json
use std/path.Utf8Path
blocking func run(): i32 {
var application = Application.new("json-normalize", "Normalize one JSON document.") catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
application.add_positional("PATH", true, "JSON file to read.") catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
let arguments = application.parse_process() catch failure {
if failure.has_code("std.cli.missing_positional")
|| failure.has_code("std.cli.unexpected_positional") {
report_usage(&application) catch _ { return 2 }
} else {
report_failure(&failure) catch _ { return 2 }
}
return 2
}
let requested = arguments.positional("PATH") otherwise { return 2 }
let path = Utf8Path.new(requested) catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
let source = fs.read_to_string_blocking(&path) catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
let value = json.parse(&source) catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
var output = io.stdout()
json.write(&+output, &value) catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
output.write_text_blocking("\n") catch failure {
report_failure(&failure) catch _ { return 2 }
return 2
}
return 0
}
blocking func report_usage(application: &Application): void! {
var output = io.stderr()
let usage = application.usage()
output.write_text_blocking(&usage)?
output.write_text_blocking("\n")?
return
}
blocking func report_failure(failure: &error): void! {
var output = io.stderr()
output.write_text_blocking("json-normalize: ")?
output.write_text_blocking(failure.code())?
output.write_text_blocking(": ")?
output.write_text_blocking(failure.message())?
output.write_text_blocking("\n")?
return
}