aboutsummaryrefslogtreecommitdiff
path: root/main.ha
blob: 9d2dfde4a2acfdd3d5c04c95a5f34bb33cc2b64c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use libui;
use libui::list;
use encoding::utf8;
use io;
use fmt;
use os;
use strings;
use unix::tty;

type mainUI = struct {
	list: list::listwidget,
};

fn globalrunehandler(ui: *libui::ttyui, r: rune) bool = {
	if (r == 'q') {
		return true;
	};
	return false;
};

fn runehandler(l: *list::listwidget, r: rune) bool = {
	switch (r) {
	case 'j' =>
		list::down(l);
	case 'k' =>
		list::up(l);
	case 'l' =>
		// to print properly suspend the ui, print, then resume
		libui::suspend(&l.ui);
		fmt::println(l.items[l.cursor])!;
		libui::resume(&l.ui);
		return true;
	case 'g' =>
		list::top(l);
		//l.cursor = 0;
	case 'G' =>
		list::bottom(l);
		//l.cursor = len(l.items) - 1;
	case '/' =>
		// TODO add commandline support
		fmt::fprintln(os::stderr, "searching")!;
		let c = l.cursor;
		if (list::search(l, "workspace") != c) {
			fmt::fprintln(os::stderr, "changed")!;
		};
	case '\n' =>
		// Enter seems to crash for now (compiler bug)
		yield;
	};
	libui::clear(l.ui);
	match (list::print(l)) {
	case void =>
		yield;
	case let e: io::error =>
		fmt::fprintln(os::stderr, io::strerror(e))!;
		return true;
	case let e: tty::error =>
		fmt::fprintln(os::stderr, tty::strerror(e))!;
		return true;
	};
	return false;
};

export fn main() void = {
	let in = match (io::drain(os::stdin)) {
	case let in: []u8 =>
		yield in;
	case let e: io::error =>
		fmt::fatal(io::strerror(e));
	};
	defer free(in);
	let sin = strings::fromutf8(in);
	sin = strings::trim(sin, '\n');
	let items = strings::split(sin, "\n");
	defer free(items);

	let ui = libui::init();
	defer libui::finish(&ui);
	let l = list::newlist(ui, items...);
	libui::addlistener(&ui, &globalrunehandler);
	list::addlistener(&l, &runehandler);
	libui::clear(l.ui);
	match (list::print(&l)) {
	case void =>
		yield;
	case let e: io::error =>
		fmt::fprintln(os::stderr, io::strerror(e))!;
		return;
	case let e: tty::error =>
		fmt::fprintln(os::stderr, tty::strerror(e))!;
		return;
	};
	for (true) {
		let r = match (libui::scan(ui)) {
		case let r: rune =>
			yield r;
		case utf8::invalid =>
			fmt::fprintln(os::stderr, "Invalid utf8 sequence")!;
			break;
		case io::EOF =>
			fmt::fprintln(os::stderr, "EOF")!;
			break;
		case let e: io::error =>
			fmt::fprintln(os::stderr, io::strerror(e))!;
			break;
		};
		if (libui::notify(&ui, r)) {
			break;
		};
		if (list::notify(&l, r)) {
			break;
		};
	};
};