From a7aadafc8d6842fb960786d4840dc29c490d3071 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 18 Jun 2026 16:42:03 +0200 Subject: lib: add simple echo router --- ttwhy/routers/echo.cppm | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 ttwhy/routers/echo.cppm (limited to 'ttwhy/routers') 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 + +#include +#include + +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 + struct echo + { + explicit echo(StreamType & stream) + : m_output_stream{stream} + {} + + auto process(ttwhy::input_event event) -> asio::awaitable + { + co_await std::visit( + [&](auto && event) -> asio::awaitable { + using event_type = std::decay_t; + + if constexpr (std::same_as) + { + co_await process_character(event.value); + } + else if constexpr (std::same_as) + { + co_await process_control_key(event.key); + } + else if constexpr (std::same_as) + { + co_await process_navigation_key(event.key); + } + }, + event); + } + + private: + auto process_character(char character) -> asio::awaitable + { + 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 + { + 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 + { + 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 -- cgit v1.2.3