8#ifndef INCLUDED_ORCUS_JSON_PARSER_HPP
9#define INCLUDED_ORCUS_JSON_PARSER_HPP
11#include "json_parser_base.hpp"
58 (void)key; (void)transient;
91 void string(std::string_view val,
bool transient)
93 (void)val; (void)transient;
113template<
typename HandlerT>
117 typedef HandlerT handler_type;
125 json_parser(std::string_view content, handler_type& hdl);
141 handler_type& m_handler;
144template<
typename _Handler>
146 std::string_view content, handler_type& hdl) :
147 json::parser_base(content), m_handler(hdl) {}
149template<
typename _Handler>
152 m_handler.begin_parse();
163 m_handler.end_parse();
166template<
typename _Handler>
167void json_parser<_Handler>::value()
189 m_handler.boolean_true();
193 m_handler.boolean_false();
203 parse_error::throw_with(
"value: failed to parse '", cur_char(),
"'.", offset());
207template<
typename _Handler>
208void json_parser<_Handler>::array()
210 assert(cur_char() ==
'[');
212 m_handler.begin_array();
213 for (next(); has_char(); next())
217 if (cur_char() ==
']')
234 if (peek_char() ==
']')
236 parse_error::throw_with(
237 "array: ']' expected but '", cur_char(),
"' found.", offset() );
241 parse_error::throw_with(
242 "array: either ']' or ',' expected, but '", cur_char(),
"' found.", offset());
254 throw parse_error(
"array: failed to parse array.", offset());
257template<
typename _Handler>
258void json_parser<_Handler>::end_array()
260 m_handler.end_array();
265template<
typename _Handler>
266void json_parser<_Handler>::object()
268 assert(cur_char() ==
'{');
270 bool require_new_key =
false;
271 m_handler.begin_object();
272 for (next(); has_char(); next())
276 throw parse_error(
"object: stream ended prematurely before reaching a key.", offset());
283 parse_error::throw_with(
284 "object: new key expected, but '", cur_char(),
"' found.", offset());
286 m_handler.end_object();
293 parse_error::throw_with(
294 "object: '\"' was expected, but '", cur_char(),
"' found.", offset());
296 require_new_key =
false;
304 case parse_quoted_string_state::error_no_closing_quote:
305 throw parse_error(
"object: stream ended prematurely before reaching the closing quote of a key", offset());
306 case parse_quoted_string_state::error_illegal_escape_char:
307 parse_error::throw_with(
308 "object: illegal escape character '", cur_char(),
"' in key value", offset());
310 case parse_quoted_string_state::error_invalid_hex_digits:
311 throw parse_error(
"object: hex digits in escaped surrogate is invalid", offset());
313 throw parse_error(
"object: unknown error while parsing a key value", offset());
317 m_handler.object_key({res.str, res.length}, res.transient);
320 if (cur_char() !=
':')
321 parse_error::throw_with(
322 "object: ':' was expected, but '", cur_char(),
"' found.", offset());
328 throw parse_error(
"object: stream ended prematurely before reaching a value.", offset());
334 throw parse_error(
"object: stream ended prematurely before reaching either '}' or ','.", offset());
339 m_handler.end_object();
344 require_new_key =
true;
347 parse_error::throw_with(
348 "object: either '}' or ',' expected, but '", cur_char(),
"' found.", offset());
352 throw parse_error(
"object: closing '}' was never reached.", offset());
355template<
typename _Handler>
356void json_parser<_Handler>::number()
358 assert(is_numeric(cur_char()) || cur_char() ==
'-');
360 double val = parse_double_or_throw();
361 m_handler.number(val);
365template<
typename _Handler>
366void json_parser<_Handler>::string()
371 m_handler.string({res.str, res.length}, res.transient);
378 case parse_quoted_string_state::error_no_closing_quote:
379 throw parse_error(
"string: stream ended prematurely before reaching the closing quote", offset());
381 case parse_quoted_string_state::error_illegal_escape_char:
382 parse_error::throw_with(
"string: illegal escape character '", cur_char(),
"'", offset());
384 case parse_quoted_string_state::error_invalid_hex_digits:
385 throw parse_error(
"string: invalid hex digits for unicode", offset());
389 std::ostringstream os;
390 os <<
"string: unknown error (code=" << res.length <<
")";
Definition json_parser_base.hpp:20
Definition json_parser.hpp:19
void string(std::string_view val, bool transient)
Definition json_parser.hpp:91
void null()
Definition json_parser.hpp:79
void boolean_true()
Definition json_parser.hpp:69
void end_parse()
Definition json_parser.hpp:29
void begin_object()
Definition json_parser.hpp:44
void object_key(std::string_view key, bool transient)
Definition json_parser.hpp:56
void begin_parse()
Definition json_parser.hpp:24
void boolean_false()
Definition json_parser.hpp:74
void end_array()
Definition json_parser.hpp:39
void begin_array()
Definition json_parser.hpp:34
void end_object()
Definition json_parser.hpp:64
void number(double val)
Definition json_parser.hpp:101
json_parser(std::string_view content, handler_type &hdl)
Definition json_parser.hpp:145
void parse()
Definition json_parser.hpp:150
Definition exception.hpp:94
std::ptrdiff_t offset() const
Definition parser_global.hpp:40