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);
142 handler_type& m_handler;
145template<
typename _Handler>
147 std::string_view content, handler_type& hdl) :
148 json::parser_base(content), m_handler(hdl) {}
150template<
typename _Handler>
153 m_handler.begin_parse();
164 m_handler.end_parse();
167template<
typename _Handler>
168void json_parser<_Handler>::root_value()
181 parse_error::throw_with(
182 "root_value: either '[' or '{' was expected, but '", cur_char(),
"' was found.", offset());
186template<
typename _Handler>
187void json_parser<_Handler>::value()
209 m_handler.boolean_true();
213 m_handler.boolean_false();
223 parse_error::throw_with(
"value: failed to parse '", cur_char(),
"'.", offset());
227template<
typename _Handler>
228void json_parser<_Handler>::array()
230 assert(cur_char() ==
'[');
232 m_handler.begin_array();
233 for (next(); has_char(); next())
237 if (cur_char() ==
']')
254 if (peek_char() ==
']')
256 parse_error::throw_with(
257 "array: ']' expected but '", cur_char(),
"' found.", offset() );
261 parse_error::throw_with(
262 "array: either ']' or ',' expected, but '", cur_char(),
"' found.", offset());
274 throw parse_error(
"array: failed to parse array.", offset());
277template<
typename _Handler>
278void json_parser<_Handler>::end_array()
280 m_handler.end_array();
285template<
typename _Handler>
286void json_parser<_Handler>::object()
288 assert(cur_char() ==
'{');
290 bool require_new_key =
false;
291 m_handler.begin_object();
292 for (next(); has_char(); next())
296 throw parse_error(
"object: stream ended prematurely before reaching a key.", offset());
303 parse_error::throw_with(
304 "object: new key expected, but '", cur_char(),
"' found.", offset());
306 m_handler.end_object();
313 parse_error::throw_with(
314 "object: '\"' was expected, but '", cur_char(),
"' found.", offset());
316 require_new_key =
false;
322 if (res.length == parse_quoted_string_state::error_no_closing_quote)
323 throw parse_error(
"object: stream ended prematurely before reaching the closing quote of a key.", offset());
324 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
325 parse_error::throw_with(
326 "object: illegal escape character '", cur_char(),
"' in key value.", offset());
328 throw parse_error(
"object: unknown error while parsing a key value.", offset());
331 m_handler.object_key({res.str, res.length}, res.transient);
334 if (cur_char() !=
':')
335 parse_error::throw_with(
336 "object: ':' was expected, but '", cur_char(),
"' found.", offset());
342 throw parse_error(
"object: stream ended prematurely before reaching a value.", offset());
348 throw parse_error(
"object: stream ended prematurely before reaching either '}' or ','.", offset());
353 m_handler.end_object();
358 require_new_key =
true;
361 parse_error::throw_with(
362 "object: either '}' or ',' expected, but '", cur_char(),
"' found.", offset());
366 throw parse_error(
"object: closing '}' was never reached.", offset());
369template<
typename _Handler>
370void json_parser<_Handler>::number()
372 assert(is_numeric(cur_char()) || cur_char() ==
'-');
374 double val = parse_double_or_throw();
375 m_handler.number(val);
379template<
typename _Handler>
380void json_parser<_Handler>::string()
385 m_handler.string({res.str, res.length}, res.transient);
390 if (res.length == parse_quoted_string_state::error_no_closing_quote)
391 throw parse_error(
"string: stream ended prematurely before reaching the closing quote.", offset());
392 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
393 parse_error::throw_with(
"string: illegal escape character '", cur_char(),
"'.", offset());
395 throw parse_error(
"string: unknown error.", offset());
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:146
void parse()
Definition json_parser.hpp:151
Definition exception.hpp:94
std::ptrdiff_t offset() const
Definition parser_global.hpp:33