pub fn main(world: World) -> Void raises { let enter: u32 = std.term.keyCode("\n") let enter_len: usize = std.term.keyByteLen("\n") let up: u32 = std.term.keyCode("\x1b[A") let up_len: usize = std.term.keyByteLen("\x1b[A") let down: u32 = std.term.keyCode("\x1b[B") let right: u32 = std.term.keyCode("\x1b[C") let left: u32 = std.term.keyCode("\x1b[D") let escape: u32 = std.term.keyCode("\x1b") let tab: u32 = std.term.keyCode("\t") let backspace: u32 = std.term.keyCode("\x7f") let ctrl_c: u32 = std.term.keyCode("\x03") let delete: u32 = std.term.keyCode("\x1b[3~") let home: u32 = std.term.keyCode("\x1b[H") let home_tilde: u32 = std.term.keyCode("\x1b[1~") let home_len: usize = std.term.keyByteLen("\x1b[H") let end_key: u32 = std.term.keyCode("\x1b[F") let end_tilde: u32 = std.term.keyCode("\x1b[4~") let page_up: u32 = std.term.keyCode("\x1b[5~") let page_down: u32 = std.term.keyCode("\x1b[6~") let page_down_len: usize = std.term.keyByteLen("\x1b[6~") let insert: u32 = std.term.keyCode("\x1b[2~") let shift_tab: u32 = std.term.keyCode("\x1b[Z") let f1_legacy: u32 = std.term.keyCode("\x1bOP") let f1_csi: u32 = std.term.keyCode("\x1b[11~") let f5: u32 = std.term.keyCode("\x1b[15~") let f10: u32 = std.term.keyCode("\x1b[21~") let f12: u32 = std.term.keyCode("\x1b[24~") let f12_len: usize = std.term.keyByteLen("\x1b[24~") let paste_start: u32 = std.term.keyCode("\x1b[200~") let paste_end: u32 = std.term.keyCode("\x1b[201~") let paste_len: usize = std.term.keyByteLen("\x1b[200~") let ctrl_a: u32 = std.term.keyCode("\x01") let ctrl_l: u32 = std.term.keyCode("\x0c") let ctrl_r: u32 = std.term.keyCode("\x12") let ctrl_w: u32 = std.term.keyCode("\x17") let lambda: u32 = std.term.keyCode("λ") let lambda_len: usize = std.term.keyByteLen("λ") let bad: u32 = std.term.keyCode("\x1b[") var cursor_to_buffer: [24]u8 = [0_u8; 24] var cursor_up_buffer: [12]u8 = [0_u8; 12] var cursor_down_buffer: [12]u8 = [0_u8; 12] var cursor_right_buffer: [12]u8 = [0_u8; 12] var cursor_left_buffer: [12]u8 = [0_u8; 12] var cursor_zero_buffer: [12]u8 = [0_u8; 12] var cursor_small_buffer: [3]u8 = [0_u8; 3] let cursor_to: Maybe> = std.term.cursorTo(cursor_to_buffer, 12_usize, 34_usize) let cursor_up: Maybe> = std.term.cursorUp(cursor_up_buffer, 3_usize) let cursor_down: Maybe> = std.term.cursorDown(cursor_down_buffer, 4_usize) let cursor_right: Maybe> = std.term.cursorRight(cursor_right_buffer, 5_usize) let cursor_left: Maybe> = std.term.cursorLeft(cursor_left_buffer, 6_usize) let cursor_zero: Maybe> = std.term.cursorUp(cursor_zero_buffer, 0_usize) let cursor_small: Maybe> = std.term.cursorTo(cursor_small_buffer, 12_usize, 34_usize) let style_ok: Bool = std.mem.eql(std.term.underline(), "\x1b[4m") && std.mem.eql(std.term.fgBlack(), "\x1b[30m") && std.mem.eql(std.term.bgDefault(), "\x1b[49m") && std.mem.eql(std.term.bgBlack(), "\x1b[40m") && std.mem.eql(std.term.bgBlue(), "\x1b[44m") && std.mem.eql(std.term.bgWhite(), "\x1b[47m") let clear_ok: Bool = std.mem.eql(std.term.clearScreenDown(), "\x1b[0J") && std.mem.eql(std.term.clearScreenUp(), "\x1b[1J") && std.mem.eql(std.term.clearLineRight(), "\x1b[0K") && std.mem.eql(std.term.clearLineLeft(), "\x1b[1K") let cursor_ok: Bool = std.mem.eql(std.term.saveCursor(), "\x1b[s") && std.mem.eql(std.term.restoreCursor(), "\x1b[u") && std.mem.eql(std.term.enterBracketedPaste(), "\x1b[?2004h") && std.mem.eql(std.term.leaveBracketedPaste(), "\x1b[?2004l") let mouse_ok: Bool = std.mem.eql(std.term.enterMouseCapture(), "\x1b[?1000h\x1b[?1002h\x1b[?1006h") && std.mem.eql(std.term.leaveMouseCapture(), "\x1b[?1006l\x1b[?1002l\x1b[?1000l") if enter != std.term.keyEnter() || enter_len != 1_usize || up != std.term.keyArrowUp() || up_len != 3_usize || down != std.term.keyArrowDown() || right != std.term.keyArrowRight() || left != std.term.keyArrowLeft() || escape != std.term.keyEscape() || tab != std.term.keyTab() || backspace != std.term.keyBackspace() || ctrl_c != std.term.keyCtrlC() || delete != std.term.keyDelete() || home != std.term.keyHome() || home_tilde != std.term.keyHome() || home_len != 3_usize || end_key != std.term.keyEnd() || end_tilde != std.term.keyEnd() || page_up != std.term.keyPageUp() || page_down != std.term.keyPageDown() || page_down_len != 4_usize || insert != std.term.keyInsert() || shift_tab != std.term.keyShiftTab() || f1_legacy != std.term.keyF1() || f1_csi != std.term.keyF1() || f5 != std.term.keyF5() || f10 != std.term.keyF10() || f12 != std.term.keyF12() || f12_len != 5_usize || paste_start != std.term.keyPasteStart() || paste_end != std.term.keyPasteEnd() || paste_len != 6_usize || std.term.keyF2() != 1114125_u32 || std.term.keyF3() != 1114126_u32 || std.term.keyF4() != 1114127_u32 || std.term.keyF6() != 1114129_u32 || std.term.keyF7() != 1114130_u32 || std.term.keyF8() != 1114131_u32 || std.term.keyF9() != 1114132_u32 || std.term.keyF11() != 1114134_u32 || ctrl_a != std.term.keyCtrlA() || ctrl_l != std.term.keyCtrlL() || ctrl_r != std.term.keyCtrlR() || ctrl_w != std.term.keyCtrlW() || std.term.keyCtrlD() != 4_u32 || std.term.keyCtrlE() != 5_u32 || std.term.keyCtrlK() != 11_u32 || std.term.keyCtrlN() != 14_u32 || std.term.keyCtrlP() != 16_u32 || std.term.keyCtrlU() != 21_u32 || lambda != 955_u32 || lambda_len != 2_usize || bad != std.term.keyNone() || !style_ok || !clear_ok || !cursor_ok || !mouse_ok || !cursor_to.has || !std.mem.eql(cursor_to.value, "\x1b[12;34H") || !cursor_up.has || !std.mem.eql(cursor_up.value, "\x1b[3A") || !cursor_down.has || !std.mem.eql(cursor_down.value, "\x1b[4B") || !cursor_right.has || !std.mem.eql(cursor_right.value, "\x1b[5C") || !cursor_left.has || !std.mem.eql(cursor_left.value, "\x1b[6D") || !cursor_zero.has || std.mem.len(cursor_zero.value) != 0_usize || cursor_small.has { check world.err.write("term key decode failed\n") return } let stdin_tty: Bool = std.term.stdinIsTty() let stdout_tty: Bool = std.term.stdoutIsTty() let width: usize = std.term.widthOr(80_usize) let height: usize = std.term.heightOr(24_usize) var input: [16]u8 = [0_u8; 16] let pending: Maybe = std.term.readInput(input) if pending.has { if pending.value == 0_usize || pending.value > std.mem.len(input) { check world.err.write("term input read failed\n") return } let input_bytes: Span = std.mem.prefix(input, pending.value) let input_key: u32 = std.term.keyCode(input_bytes) let input_key_len: usize = std.term.keyByteLen(input_bytes) if input_key == std.term.keyNone() || input_key_len == 0_usize || input_key_len > pending.value { check world.err.write("term input decode failed\n") return } } var raw_checked: Bool = true if stdin_tty { raw_checked = std.term.enterRawMode() if raw_checked { raw_checked = std.term.leaveRawMode() } } else { raw_checked = !std.term.enterRawMode() && std.term.leaveRawMode() } if width == 0_usize || height == 0_usize || !raw_checked || stdin_tty && !stdin_tty || stdout_tty && !stdout_tty { check world.err.write("term metadata failed\n") return } check world.out.write(std.term.enterAltScreen()) check world.out.write(std.term.clearScreen()) check world.out.write(std.term.cursorHome()) check world.out.write(std.term.hideCursor()) check world.out.write(std.term.bold()) check world.out.write(std.term.dim()) check world.out.write(std.term.underline()) check world.out.write(std.term.inverse()) check world.out.write(std.term.fgBlack()) check world.out.write(std.term.fgRed()) check world.out.write(std.term.fgGreen()) check world.out.write(std.term.fgYellow()) check world.out.write(std.term.fgBlue()) check world.out.write(std.term.fgMagenta()) check world.out.write(std.term.fgCyan()) check world.out.write(std.term.fgWhite()) check world.out.write(std.term.fgDefault()) check world.out.write(std.term.bgBlack()) check world.out.write(std.term.bgRed()) check world.out.write(std.term.bgGreen()) check world.out.write(std.term.bgYellow()) check world.out.write(std.term.bgBlue()) check world.out.write(std.term.bgMagenta()) check world.out.write(std.term.bgCyan()) check world.out.write(std.term.bgWhite()) check world.out.write(std.term.bgDefault()) check world.out.write(std.term.saveCursor()) check world.out.write(std.term.restoreCursor()) check world.out.write(std.term.enterBracketedPaste()) check world.out.write(std.term.leaveBracketedPaste()) check world.out.write(std.term.enterMouseCapture()) check world.out.write(std.term.leaveMouseCapture()) check world.out.write("term ansi") check world.out.write(std.term.reset()) check world.out.write(std.term.clearLine()) check world.out.write(std.term.clearLineRight()) check world.out.write(std.term.clearLineLeft()) check world.out.write(std.term.clearScreenDown()) check world.out.write(std.term.clearScreenUp()) check world.out.write(std.term.showCursor()) check world.out.write(std.term.leaveAltScreen()) check world.out.write("\n") }