aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/scanners/terminal_policies.cppm
blob: e5863d331b2d137e67eeec6a983823eb524d1f7d (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
module;

#include <string>

export module ttwhy.scanners:terminal_policies;

import :events;
import :concepts;

namespace ttwhy::scanners
{

  export struct ansi_policy
  {
    constexpr auto static resolve_vt220_keypad(std::string & buffer, ttwhy::ansi_sink auto & sink) -> void
    {
      auto key = [](auto terminator) {
        switch (terminator)
        {
          case '1':
          case '7':
            return navigation_key::home;
          case '2':
            return navigation_key::insert_key;
          case '3':
            return navigation_key::delete_key;
          case '4':
          case '8':
            return navigation_key::end;
          case '5':
            return navigation_key::page_up;
          case '6':
            return navigation_key::page_down;
          default:
            return static_cast<navigation_key>(-1);
        }
      }(buffer.back());
      sink(navigation_event{key});
    }

    constexpr auto static resolve_vt100_cursor(char terminator, ttwhy::ansi_sink auto & sink) -> void
    {
      auto key = [terminator] {
        switch (terminator)
        {
          case 'A':
            return navigation_key::up;
          case 'B':
            return navigation_key::down;
          case 'C':
            return navigation_key::right;
          case 'D':
            return navigation_key::left;
          case 'H':
            return navigation_key::home;
          case 'F':
            return navigation_key::end;
          default:
            return static_cast<navigation_key>(-1);
        }
      }();
      sink(navigation_event{key});
    }

    constexpr auto static resolve_ss3(char terminator, ttwhy::ansi_sink auto & sink) -> void
    {
      return resolve_vt100_cursor(terminator, sink);
    }
  };

}  // namespace ttwhy::scanners