aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/routers/echo.cppm
diff options
context:
space:
mode:
Diffstat (limited to 'ttwhy/routers/echo.cppm')
-rw-r--r--ttwhy/routers/echo.cppm84
1 files changed, 84 insertions, 0 deletions
diff --git a/ttwhy/routers/echo.cppm b/ttwhy/routers/echo.cppm
new file mode 100644
index 0000000..41b7b51
--- /dev/null
+++ b/ttwhy/routers/echo.cppm
@@ -0,0 +1,84 @@
+module;
+
+#include <asio.hpp>
+
+#include <format>
+#include <string_view>
+
+export module ttwhy.routers:echo;
+
+import ttwhy;
+
+namespace ttwhy::routers
+{
+
+ using namespace std::string_view_literals;
+
+ constexpr auto vte_backspace_sequence = "\b \b"sv;
+
+ export template<typename StreamType>
+ struct echo
+ {
+ explicit echo(StreamType & stream)
+ : m_output_stream{stream}
+ {}
+
+ auto process(ttwhy::input_event event) -> asio::awaitable<void>
+ {
+ co_await std::visit(
+ [&](auto && event) -> asio::awaitable<void> {
+ using event_type = std::decay_t<decltype(event)>;
+
+ if constexpr (std::same_as<character_event, event_type>)
+ {
+ co_await process_character(event.value);
+ }
+ else if constexpr (std::same_as<control_event, event_type>)
+ {
+ co_await process_control_key(event.key);
+ }
+ else if constexpr (std::same_as<navigation_event, event_type>)
+ {
+ co_await process_navigation_key(event.key);
+ }
+ },
+ event);
+ }
+
+ private:
+ auto process_character(char character) -> asio::awaitable<void>
+ {
+ co_await asio::async_write(m_output_stream, asio::buffer(&character, 1), asio::as_tuple(asio::use_awaitable));
+ }
+
+ auto process_control_key(control_key key) -> asio::awaitable<void>
+ {
+ switch (key)
+ {
+ case control_key::backspace:
+ co_await asio::async_write(m_output_stream, asio::buffer(vte_backspace_sequence),
+ asio::as_tuple(asio::use_awaitable));
+ break;
+ default:
+ co_await asio::async_write(m_output_stream, asio::buffer(std::format("{{CTRL:{}}}", std::to_underlying(key))),
+ asio::as_tuple(asio::use_awaitable));
+ };
+ }
+
+ auto process_navigation_key(navigation_key key) -> asio::awaitable<void>
+ {
+ switch (key)
+ {
+ case navigation_key::delete_key:
+ co_await asio::async_write(m_output_stream, asio::buffer("{DEL}"), asio::as_tuple(asio::use_awaitable));
+ break;
+ default:
+ co_await asio::async_write(m_output_stream, asio::buffer(std::format("{{NAV:{}}}", std::to_underlying(key))),
+ asio::as_tuple(asio::use_awaitable));
+ }
+ }
+
+ StreamType & m_output_stream;
+ };
+
+} // namespace ttwhy::routers