Programming Language

Nocter

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

prefix.nct

use std/cli.Application
use std/io.BlockingWriter
use std/io
use std/io/buffer.BlockingBufReader
use std/string.String

blocking func run(): i32 {
    var application = Application.new("stdin-prefix", "Prefix every input line.") catch failure {
        report_failure(&failure) catch _ { return 2 }
        return 2
    }
    application.add_positional("PREFIX", true, "Text written before every line.") 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 prefix = arguments.positional("PREFIX") otherwise { return 2 }
    prefix_lines(prefix) catch failure {
        report_failure(&failure) catch _ { return 2 }
        return 2
    }
    return 0
}

blocking func prefix_lines(prefix: &str): void! {
    var input = BlockingBufReader.new(io.stdin())
    var output = io.stdout()
    var line = String.empty()
    while input.read_line_into_blocking(&+line)? {
        output.write_text_blocking(prefix)?
        output.write_line_blocking(&line)?
    }
    return
}

blocking func report_usage(application: &Application): void! {
    let usage = application.usage()
    io.eprintln(&usage)?
    return
}

blocking func report_failure(failure: &error): void! {
    io.eprint("stdin-prefix: ")?
    io.eprint(failure.code())?
    io.eprint(": ")?
    io.eprintln(failure.message())?
    return
}