summaryrefslogtreecommitdiff
path: root/main.ha
diff options
context:
space:
mode:
Diffstat (limited to 'main.ha')
-rw-r--r--main.ha60
1 files changed, 60 insertions, 0 deletions
diff --git a/main.ha b/main.ha
new file mode 100644
index 0000000..0b1737c
--- /dev/null
+++ b/main.ha
@@ -0,0 +1,60 @@
+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);
+};