Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

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
}