15 template <
typename Continuation>
16 constexpr void operator()(telnetpp::bytes data, Continuation &&c)
18 std::ranges::for_each(
19 data, [&](telnetpp::byte by) { parse_byte(by, c); });
25 enum class parsing_state : std::uint8_t
31 state_subnegotiation_content,
32 state_subnegotiation_content_iac
35 parsing_state state_{parsing_state::state_idle};
37 telnetpp::byte_storage plain_data_;
38 telnetpp::byte_storage subnegotiation_content_;
39 telnetpp::negotiation_type negotiation_type_;
40 telnetpp::option_type subnegotiation_option_;
42 template <
typename Continuation>
43 constexpr void parse_byte(telnetpp::byte by, Continuation &&c)
47 case parsing_state::state_idle:
51 case parsing_state::state_iac:
55 case parsing_state::state_negotiation:
56 parse_negotiation(by, c);
59 case parsing_state::state_subnegotiation:
60 parse_subnegotiation(by, c);
63 case parsing_state::state_subnegotiation_content:
64 parse_subnegotiation_content(by, c);
67 case parsing_state::state_subnegotiation_content_iac:
68 parse_subnegotiation_content_iac(by, c);
76 template <
typename Continuation>
77 constexpr void parse_idle(telnetpp::byte by, Continuation &&c)
82 state_ = parsing_state::state_iac;
86 plain_data_.push_back(by);
91 template <
typename Continuation>
92 constexpr void parse_iac(telnetpp::byte by, Continuation &&c)
97 plain_data_.push_back(by);
98 state_ = parsing_state::state_idle;
106 negotiation_type_ = by;
107 state_ = parsing_state::state_negotiation;
112 state_ = parsing_state::state_subnegotiation;
118 state_ = parsing_state::state_idle;
123 template <
typename Continuation>
124 constexpr void parse_negotiation(telnetpp::byte by, Continuation &&c)
127 state_ = parsing_state::state_idle;
130 template <
typename Continuation>
131 constexpr void parse_subnegotiation(telnetpp::byte by, Continuation &&c)
133 subnegotiation_option_ = by;
134 subnegotiation_content_.clear();
135 state_ = parsing_state::state_subnegotiation_content;
138 template <
typename Continuation>
139 constexpr void parse_subnegotiation_content(
140 telnetpp::byte by, Continuation &&c)
145 state_ = parsing_state::state_subnegotiation_content_iac;
149 subnegotiation_content_.push_back(by);
154 template <
typename Continuation>
155 constexpr void parse_subnegotiation_content_iac(
156 telnetpp::byte by, Continuation &&c)
162 subnegotiation_option_, subnegotiation_content_});
163 state_ = parsing_state::state_idle;
167 subnegotiation_content_.push_back(by);
168 state_ = parsing_state::state_subnegotiation_content;
173 template <
typename Continuation>
174 constexpr void emit_plain_data(Continuation &&c)
176 if (!plain_data_.empty())