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
}