From 43e44bc35b18c7e6938d8b5103ae8a76dd06f5a0 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Tue, 22 Sep 2026 16:27:21 +0200 Subject: lib/routers: introduce router concept --- CMakeLists.txt | 1 + ttwhy/routers/echo.tests.cpp | 24 ++++++++++++++++++++++++ ttwhy/routers/mod.cppm | 1 + ttwhy/routers/router_concepts.cppm | 20 ++++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 ttwhy/routers/router_concepts.cppm diff --git a/CMakeLists.txt b/CMakeLists.txt index 84d89a3..4228310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,7 @@ target_sources("ttwhy-core" PUBLIC "ttwhy/routers/echo.cppm" "ttwhy/routers/mod.cppm" + "ttwhy/routers/router_concepts.cppm" "ttwhy/scanners/mod.cppm" "ttwhy/scanners/terminal_concepts.cppm" diff --git a/ttwhy/routers/echo.tests.cpp b/ttwhy/routers/echo.tests.cpp index f12d08b..c6ea10a 100644 --- a/ttwhy/routers/echo.tests.cpp +++ b/ttwhy/routers/echo.tests.cpp @@ -45,8 +45,32 @@ namespace token, buffers); } }; + + struct incomplete_router_no_policy + { + auto process(ttwhy::scanners::input_event) -> asio::awaitable; + }; + + struct incomplete_router_no_process + { + using terminal_policy = ttwhy::scanners::xterm_policy; + }; + + struct incomplete_router_wrong_return + { + using terminal_policy = ttwhy::scanners::xterm_policy; + auto process(ttwhy::scanners::input_event) -> void; + }; } // namespace +TEST_CASE("The router concept validates router candidate interfaces", "[router][concept]") +{ + STATIC_REQUIRE(ttwhy::router>); + STATIC_REQUIRE_FALSE(ttwhy::router); + STATIC_REQUIRE_FALSE(ttwhy::router); + STATIC_REQUIRE_FALSE(ttwhy::router); +} + SCENARIO("The echo router handles terminal navigation within the valid printed area", "[router][echo]") { GIVEN("An initialized echo router with a mock stream") diff --git a/ttwhy/routers/mod.cppm b/ttwhy/routers/mod.cppm index fbab282..f5e151b 100644 --- a/ttwhy/routers/mod.cppm +++ b/ttwhy/routers/mod.cppm @@ -1,3 +1,4 @@ export module ttwhy.routers; export import :echo; +export import :router_concepts; diff --git a/ttwhy/routers/router_concepts.cppm b/ttwhy/routers/router_concepts.cppm new file mode 100644 index 0000000..ce143cb --- /dev/null +++ b/ttwhy/routers/router_concepts.cppm @@ -0,0 +1,20 @@ +module; + +#include + +#include + +export module ttwhy.routers:router_concepts; + +import ttwhy.scanners; + +namespace ttwhy +{ + + export template + concept router = requires(Candidate candidate, scanners::input_event event) { + typename Candidate::terminal_policy; + { candidate.process(event) } -> std::same_as>; + }; + +} // namespace ttwhy -- cgit v1.2.3