module; #include export module ttwhy.scanners:terminal_policies; import :events; import :concepts; namespace ttwhy::scanners { export struct ansi_policy { constexpr auto static resolve_vt220_keypad(std::string & buffer, ttwhy::ansi_sink auto & sink) -> void { auto key = [](auto terminator) { switch (terminator) { case '1': case '7': return navigation_key::home; case '2': return navigation_key::insert_key; case '3': return navigation_key::delete_key; case '4': case '8': return navigation_key::end; case '5': return navigation_key::page_up; case '6': return navigation_key::page_down; default: return static_cast(-1); } }(buffer.back()); sink(navigation_event{key}); } constexpr auto static resolve_vt100_cursor(char terminator, ttwhy::ansi_sink auto & sink) -> void { auto key = [terminator] { switch (terminator) { case 'A': return navigation_key::up; case 'B': return navigation_key::down; case 'C': return navigation_key::right; case 'D': return navigation_key::left; case 'H': return navigation_key::home; case 'F': return navigation_key::end; default: return static_cast(-1); } }(); sink(navigation_event{key}); } constexpr auto static resolve_ss3(char terminator, ttwhy::ansi_sink auto & sink) -> void { return resolve_vt100_cursor(terminator, sink); } }; } // namespace ttwhy::scanners