3 #include "telnetpp/options/new_environ/detail/stream.hpp"
4 #include "telnetpp/options/new_environ/protocol.hpp"
8 namespace telnetpp::options::new_environ::detail {
10 enum class request_parser_state
18 struct request_parsing_state
20 request_parser_state state = request_parser_state::state_send;
27 template <
typename Continuation>
28 void parse_request_send(
29 request_parsing_state &state,
30 telnetpp::bytes::iterator ,
33 state.state = request_parser_state::state_type;
39 template <
typename Continuation>
40 void parse_request_type(
41 request_parsing_state &state,
42 telnetpp::bytes::iterator current,
45 state.req.type = byte_to_type(*current);
46 state.state = request_parser_state::state_name;
52 template <
typename Continuation>
53 void parse_request_name(
54 request_parsing_state &state,
55 telnetpp::bytes::iterator current,
61 state.state = request_parser_state::state_name_esc;
68 state.req.type = byte_to_type(*current);
72 state.req.name.push_back(*current);
80 template <
typename Continuation>
81 void parse_request_name_esc(
82 request_parsing_state &state,
83 telnetpp::bytes::iterator current,
86 state.req.name.push_back(*current);
87 state.state = request_parser_state::state_name;
93 template <
typename Continuation>
94 void parse_request_byte(
95 request_parsing_state &state,
96 telnetpp::bytes::iterator current,
101 case request_parser_state::state_send:
102 parse_request_send(state, current, cont);
105 case request_parser_state::state_type:
106 parse_request_type(state, current, cont);
109 case request_parser_state::state_name:
110 parse_request_name(state, current, cont);
113 case request_parser_state::state_name_esc:
114 parse_request_name_esc(state, current, cont);
118 assert(!
"Invalid state in request parser");
126 template <
typename Continuation>
127 void parse_request_end(request_parsing_state &state, Continuation &&cont)
129 if (!state.req.name.empty())