use fmt; use getopt; use io; use net::dial; use os; use trace; use unix::signal; const help: [_]getopt::help = [ "minecraft client", ('u', "name", "username for login"), "addr", ]; export fn main() void = { signal::ignore(signal::sig::PIPE); dial::registersvc("tcp", "minecraft", [], 25565); let tracer = newtracer(os::stderr); trace::setroot(&tracer); defer trace::setroot(&trace::silent); const cmd = getopt::parse(os::args, help...); defer getopt::finish(&cmd); let username = "Player"; for (let i = 0z; i < len(cmd.opts); i += 1) { const (flag, param) = cmd.opts[i]; switch (flag) { case 'u' => username = param; case => abort(); }; }; if (len(cmd.args) != 1) { die_usage("expected exactly 1 positional argument"); }; const addr = cmd.args[0]; window_run(addr, username); }; fn error(fmt: str, args: fmt::field...) void = { fmt::errorf("{}: ", os::args[0]): void; fmt::errorfln(fmt, args...): void; }; fn die(fmt: str, args: fmt::field...) never = { error(fmt, args...); os::exit(1); }; fn die_usage(fmt: str, args: fmt::field...) never = { error(fmt, args...); getopt::printusage(os::stderr, os::args[0], help)!; os::exit(1); };