aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/main.cpp
blob: 53cf16de14f0abc0db310aae4093bb54b98271f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <asio.hpp>
#include <asio/experimental/awaitable_operators.hpp>

#include <stdio.h>

import ttwhy;
import ttwhy.routers;

auto app(int in, int out, int error) -> asio::awaitable<void>
{
  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();
}