3#include "telnetpp/options/new_environ/detail/stream.hpp"
4#include "telnetpp/options/new_environ/protocol.hpp"
8namespace telnetpp::options::new_environ::detail {
10enum class request_parser_state : std::uint8_t
18struct request_parsing_state
20 request_parser_state state_ = request_parser_state::state_send;
27template <
typename Continuation>
28constexpr void parse_request_send(
29 request_parsing_state &state,
33 state.state_ = request_parser_state::state_type;
39template <
typename Continuation>
40constexpr void parse_request_type(
41 request_parsing_state &state,
42 telnetpp::byte current,
45 state.req_.type = byte_to_type(current);
46 state.state_ = request_parser_state::state_name;
52template <
typename Continuation>
53constexpr void parse_request_name(
54 request_parsing_state &state, telnetpp::byte current, Continuation &&cont)
59 state.state_ = request_parser_state::state_name_esc;
66 state.req_.type = byte_to_type(current);
70 state.req_.name.push_back(current);
78template <
typename Continuation>
79constexpr void parse_request_name_esc(
80 request_parsing_state &state,
81 telnetpp::byte current,
84 state.req_.name.push_back(current);
85 state.state_ = request_parser_state::state_name;
91template <
typename Continuation>
92constexpr void parse_request_byte(
93 request_parsing_state &state, telnetpp::byte current, Continuation &&cont)
97 case request_parser_state::state_send:
98 parse_request_send(state, current, cont);
101 case request_parser_state::state_type:
102 parse_request_type(state, current, cont);
105 case request_parser_state::state_name:
106 parse_request_name(state, current, cont);
109 case request_parser_state::state_name_esc:
110 parse_request_name_esc(state, current, cont);
114 assert(!
"Invalid state in request parser");
122template <
typename Continuation>
123constexpr void parse_request_end(
124 request_parsing_state &state, Continuation &&cont)
126 if (!state.req_.name.empty())