#include #include #include import ttwhy; import ttwhy.routers; auto app(int in, int out, int error) -> asio::awaitable { using namespace asio::experimental::awaitable_operators; auto terminal_attributes = ttwhy::scoped_attributes{fileno(stdin)} // .canonical_mode(false) .echo(false); auto executor = co_await asio::this_coro::executor; auto input_stream = asio::posix::stream_descriptor{executor, in}; auto output_stream = asio::posix::stream_descriptor{executor, out}; auto error_stream = asio::posix::stream_descriptor{executor, error}; auto router = ttwhy::routers::echo{input_stream}; co_await (ttwhy::io::handle_signals(error_stream, terminal_attributes) || ttwhy::io::read_events(input_stream, router)); } auto main() -> int { auto context = asio::io_context{}; asio::co_spawn(context, app(::fileno(::stdin), ::fileno(::stdout), ::fileno(::stderr)), asio::detached); context.run(); }