Programming Language

Nocter

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

/examples/stdin-prefix/prefix.nct

prefix.nct

use std/io.Writer
use std/io
use std/io/buffer.BufReader
use std/process
use std/string.String

func run(): i32 {
    if process.arg_count() != 2 {
        report_usage() catch _ { return 2 }
        return 2
    }
    let prefix = process.arg(1) catch failure {
        report_failure(&failure) catch _ { return 2 }
        return 2
    } otherwise {
        report_usage() catch _ { return 2 }
        return 2
    }
    prefix_lines(prefix) catch failure {
        report_failure(&failure) catch _ { return 2 }
        return 2
    }
    return 0
}

func prefix_lines(prefix: &str): void! {
    var input = BufReader.new(io.stdin())
    var output = io.stdout()
    var line = String.empty()
    while input.read_line_into(&+line)? {
        output.write_text(prefix)?
        output.write_line(&line)?
    }
    return
}

func report_usage(): void! {
    io.eprintln("usage: stdin-prefix PREFIX")?
    return
}

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