40 namespace json_details {
41 struct handler_result_holder {
42 json_parse_handler_result value = json_parse_handler_result::Continue;
44 handler_result_holder( ) =
default;
46 constexpr handler_result_holder(
bool b )
47 : value( b ? Continue : Complete ) {}
49 constexpr handler_result_holder( json_parse_handler_result r )
52 constexpr explicit operator bool( )
const {
53 return value == json_parse_handler_result::Continue;
57 namespace hnd_checks {
60 has_on_value_handler_impl,
61 std::declval<T>( ).handle_on_value( std::declval<U>( ) ) );
63 template<
typename Handler, json_options_t P,
typename A>
64 DAW_CPP20_CONCEPT has_on_value_handler_v =
65 has_on_value_handler_impl<Handler, basic_json_pair<P, A>>;
69 has_on_array_start_handler_impl,
70 std::declval<T>( ).handle_on_array_start( std::declval<U>( ) ) );
72 template<
typename Handler, json_options_t P,
typename A>
73 DAW_CPP20_CONCEPT has_on_array_start_handler_v =
74 has_on_array_start_handler_impl<Handler, basic_json_value<P, A>>;
78 std::declval<T>( ).handle_on_array_end( ) );
82 has_on_class_start_handler_impl,
83 std::declval<T>( ).handle_on_class_start( std::declval<U>( ) ) );
85 template<
typename Handler, json_options_t P,
typename A>
86 DAW_CPP20_CONCEPT has_on_class_start_handler_v =
87 has_on_class_start_handler_impl<Handler, basic_json_value<P, A>>;
91 std::declval<T>( ).handle_on_class_end( ) );
95 has_on_number_handler_jv_impl,
96 std::declval<T>( ).handle_on_number( std::declval<U>( ) ) );
98 template<
typename Handler, json_options_t P,
typename A>
99 DAW_CPP20_CONCEPT has_on_number_handler_jv_v =
100 has_on_number_handler_jv_impl<Handler, basic_json_value<P, A>>;
103 std::declval<T>( ).handle_on_number( 0.0 ) );
107 has_on_bool_handler_jv_impl,
108 std::declval<T>( ).handle_on_bool( std::declval<U>( ) ) );
110 template<
typename Handler, json_options_t P,
typename A>
111 DAW_CPP20_CONCEPT has_on_bool_handler_jv_v =
112 has_on_bool_handler_jv_impl<Handler, basic_json_value<P, A>>;
115 std::declval<T>( ).handle_on_bool(
true ) );
119 has_on_string_handler_impl,
120 std::declval<T>( ).handle_on_string( std::declval<U>( ) ) );
122 template<
typename Handler, json_options_t P,
typename A>
123 DAW_CPP20_CONCEPT has_on_string_handler_jv_v =
124 has_on_string_handler_impl<Handler, basic_json_value<P, A>>;
127 has_on_string_handler_str_v,
128 std::declval<T>( ).handle_on_string( std::declval<std::string>( ) ) );
132 has_on_null_handler_impl,
133 std::declval<T>( ).handle_on_null( std::declval<U>( ) ) );
135 template<
typename Handler, json_options_t P,
typename A>
136 DAW_CPP20_CONCEPT has_on_null_handler_jv_v =
137 has_on_null_handler_impl<Handler, basic_json_value<P, A>>;
140 std::declval<T>( ).handle_on_null( ) );
144 has_on_error_handler_impl,
145 std::declval<T>( ).handle_on_error( std::declval<U>( ) ) );
147 template<
typename Handler, json_options_t P,
typename A>
148 DAW_CPP20_CONCEPT has_on_error_handler_v =
149 has_on_error_handler_impl<Handler, basic_json_value<P, A>>;
153 constexpr daw::remove_cvref_t<T> as_copy( T &&value ) {
157 template<
typename Handler, json_options_t P,
typename A>
158 constexpr handler_result_holder
159 handle_on_value( Handler &&handler, basic_json_pair<P, A> p ) {
160 if constexpr( hnd_checks::has_on_value_handler_v<Handler, P, A> ) {
161 return handler.handle_on_value( std::move( p ) );
164 return handler_result_holder{ };
168 template<
typename Handler, json_options_t P,
typename A>
169 constexpr handler_result_holder
170 handle_on_array_start( Handler &&handler, basic_json_value<P, A> jv ) {
171 if constexpr( hnd_checks::
172 has_on_array_start_handler_v<Handler, P, A> ) {
173 return handler.handle_on_array_start( std::move( jv ) );
176 return handler_result_holder{ };
180 template<
typename Handler>
181 constexpr handler_result_holder handle_on_array_end( Handler &&handler ) {
182 if constexpr( hnd_checks::has_on_array_end_handler_v<Handler> ) {
183 return handler.handle_on_array_end( );
185 return handler_result_holder{ };
189 template<
typename Handler, json_options_t P,
typename A>
190 constexpr handler_result_holder
191 handle_on_class_start( Handler &&handler, basic_json_value<P, A> jv ) {
192 if constexpr( hnd_checks::
193 has_on_class_start_handler_v<Handler, P, A> ) {
194 return handler.handle_on_class_start( std::move( jv ) );
197 return handler_result_holder{ };
201 template<
typename Handler>
202 constexpr handler_result_holder handle_on_class_end( Handler &&handler ) {
203 if constexpr( hnd_checks::has_on_class_end_handler_v<Handler> ) {
204 return handler.handle_on_class_end( );
206 return handler_result_holder{ };
210 template<
typename Handler, json_options_t P,
typename A>
211 constexpr handler_result_holder
212 handle_on_number( Handler &&handler, basic_json_value<P, A> &jv ) {
213 if constexpr( hnd_checks::has_on_number_handler_jv_v<Handler, P, A> ) {
214 return handler.handle_on_number( as_copy( jv ) );
215 }
else if constexpr( hnd_checks::has_on_number_handler_dbl_v<
217 return handler.handle_on_number( from_json<double>( jv ) );
220 return handler_result_holder{ };
224 template<
typename Handler, json_options_t P,
typename A>
225 constexpr handler_result_holder
226 handle_on_bool( Handler &&handler, basic_json_value<P, A> jv ) {
227 if constexpr( hnd_checks::has_on_bool_handler_jv_v<Handler, P, A> ) {
228 return handler.handle_on_bool( as_copy( jv ) );
229 }
else if constexpr( hnd_checks::has_on_bool_handler_bl_v<Handler> ) {
230 return handler.handle_on_bool( from_json<bool>( jv ) );
233 return handler_result_holder{ };
237 template<
typename Handler, json_options_t P,
typename A>
238 constexpr handler_result_holder
239 handle_on_string( Handler &&handler, basic_json_value<P, A> &jv ) {
240 if constexpr( hnd_checks::has_on_string_handler_jv_v<Handler, P, A> ) {
241 return handler.handle_on_string( as_copy( jv ) );
242 }
else if constexpr( hnd_checks::has_on_string_handler_str_v<
244 return handler.handle_on_string( jv.get_string( ) );
247 return handler_result_holder{ };
251 template<
typename Handler, json_options_t P,
typename A>
252 constexpr handler_result_holder
253 handle_on_null( Handler &&handler, basic_json_value<P, A> &jv ) {
254 if constexpr( hnd_checks::has_on_null_handler_jv_v<Handler, P, A> ) {
255 return handler.handle_on_null( as_copy( jv ) );
256 }
else if constexpr( hnd_checks::has_on_null_handler_v<Handler> ) {
257 return handler.handle_on_null( );
259 return handler_result_holder{ };
263 template<
typename Handler, json_options_t P,
typename A>
264 constexpr handler_result_holder
265 handle_on_error( Handler &&handler, basic_json_value<P, A> jv ) {
266 if constexpr( hnd_checks::has_on_error_handler_v<Handler, P, A> ) {
267 return handler.handle_on_error( std::move( jv ) );
270 return handler_result_holder{ };
278 template<json_options_t P,
typename A>
282 std::pair<iterator, iterator>
value;
285 template<
typename StackValue,
typename StackType = std::vector<StackValue>>
299 m_stack.push_back( std::move( v ) );
303 return m_stack.back( );
315 return m_stack.empty( );
319 template<
typename StackContainerPolicy = use_default,
320 std::size_t MaxDepth = daw::max_value<std::size_t>,
325 options::parse_flags_t<ParseFlags...> ) {
329 template SetPolicyOptions<ParseFlags...>>;
333 using json_value_t =
typename iterator::json_pair;
334 using stack_value_t =
338 auto parent_stack = [] DAW_CPP23_STATIC_CALL_OP {
339 if constexpr( std::is_same_v<StackContainerPolicy, use_default> ) {
342 return StackContainerPolicy{ };
345 long long class_depth = 0;
346 long long array_depth = 0;
351 bool user_completed =
false;
352 auto const complete_now = [&]( ) {
353 parent_stack.
clear( );
354 user_completed =
true;
363 auto const move_to_last = [&]( ) {
364 auto &top = parent_stack.back( );
365 while( top.value.first ) {
370 auto const process_value = [&]( json_value_t p ) {
372 auto result = json_details::handle_on_value( handler, p );
373 switch( result.value ) {
374 case json_parse_handler_result::Complete:
377 case json_parse_handler_result::SkipClassArray:
380 case json_parse_handler_result::Continue:
386 switch( jv.type( ) ) {
387 case JsonBaseParseTypes::Array: {
389 auto result = json_details::handle_on_array_start( handler, jv );
390 switch( result.value ) {
391 case json_parse_handler_result::Complete:
394 case json_parse_handler_result::SkipClassArray:
397 case json_parse_handler_result::Continue:
401 static_cast<std::size_t
>( class_depth + array_depth ) <=
403 ErrorReason::MaxDepthExceeded );
404 parent_stack.push_back(
405 { StackParseStateType::Array,
406 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
408 case JsonBaseParseTypes::Class: {
410 auto result = json_details::handle_on_class_start( handler, jv );
411 switch( result.value ) {
412 case json_parse_handler_result::Complete:
415 case json_parse_handler_result::SkipClassArray:
418 case json_parse_handler_result::Continue:
422 static_cast<std::size_t
>( class_depth + array_depth ) <=
424 ErrorReason::MaxDepthExceeded );
425 parent_stack.push_back(
426 { StackParseStateType::Class,
427 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
429 case JsonBaseParseTypes::Number: {
430 auto result = json_details::handle_on_number( handler, jv );
431 switch( result.value ) {
432 case json_parse_handler_result::Complete:
435 case json_parse_handler_result::SkipClassArray:
438 case json_parse_handler_result::Continue:
442 case JsonBaseParseTypes::Bool: {
443 auto result = json_details::handle_on_bool( handler, jv );
444 switch( result.value ) {
445 case json_parse_handler_result::Complete:
448 case json_parse_handler_result::SkipClassArray:
451 case json_parse_handler_result::Continue:
455 case JsonBaseParseTypes::String: {
456 auto result = json_details::handle_on_string( handler, jv );
457 switch( result.value ) {
458 case json_parse_handler_result::Complete:
461 case json_parse_handler_result::SkipClassArray:
464 case json_parse_handler_result::Continue:
468 case JsonBaseParseTypes::Null: {
469 auto result = json_details::handle_on_null( handler, jv );
470 switch( result.value ) {
471 case json_parse_handler_result::Complete:
474 case json_parse_handler_result::SkipClassArray:
477 case json_parse_handler_result::Continue:
481 case JsonBaseParseTypes::None:
483 auto result = json_details::handle_on_error( handler, jv );
484 switch( result.value ) {
485 case json_parse_handler_result::Complete:
488 case json_parse_handler_result::SkipClassArray:
491 case json_parse_handler_result::Continue:
498 auto const process_range = [&]( stack_value_t v ) {
499 if( v.value.first != v.value.second ) {
500 auto jv = *v.value.first;
502 parent_stack.push_back( std::move( v ) );
503 process_value( std::move( jv ) );
506 case StackParseStateType::Class: {
508 ( class_depth > 0 ) &
509 ( v.value.first.get_raw_state( ).has_more( ) and
510 v.value.first.get_raw_state( ).front( ) ==
'}' ),
511 ErrorReason::InvalidEndOfValue );
513 auto result = json_details::handle_on_class_end( handler );
514 switch( result.value ) {
515 case json_parse_handler_result::Complete:
518 case json_parse_handler_result::SkipClassArray:
519 case json_parse_handler_result::Continue:
523 case StackParseStateType::Array: {
525 ( array_depth > 0 ) &
526 ( v.value.first.get_raw_state( ).has_more( ) and
527 v.value.first.get_raw_state( ).front( ) ==
']' ),
528 ErrorReason::InvalidEndOfValue );
530 auto result = json_details::handle_on_array_end( handler );
531 switch( result.value ) {
532 case json_parse_handler_result::Complete:
535 case json_parse_handler_result::SkipClassArray:
536 case json_parse_handler_result::Continue:
544 process_value( json_value_t{ std::nullopt, std::move( jvalue ) } );
546 while( not parent_stack.empty( ) ) {
547 auto v = std::move( parent_stack.back( ) );
548 parent_stack.pop_back( );
552 ( class_depth == 0 and array_depth == 0 ),
553 ErrorReason::InvalidEndOfValue );
556 template<
typename StackContainerPolicy = use_default,
557 std::size_t MaxDepth = daw::max_value<std::size_t>,
558 json_options_t P,
typename A,
typename Handler>
559 DAW_ATTRIB_INLINE
constexpr void
561 json_event_parser<StackContainerPolicy, MaxDepth>(
562 std::move( bjv ), DAW_FWD( handler ), options::parse_flags<> );
565 template<
typename StackContainerPolicy = use_default,
566 std::size_t MaxDepth = daw::max_value<std::size_t>,
567 typename Handler,
auto... ParseFlags>
568 DAW_ATTRIB_INLINE
void
570 options::parse_flags_t<ParseFlags...> pflags ) {
572 return json_event_parser<StackContainerPolicy, MaxDepth>(
576 template<
typename StackContainerPolicy = use_default,
577 std::size_t MaxDepth = daw::max_value<std::size_t>,
580 Handler &&handler ) {
582 return json_event_parser<StackContainerPolicy, MaxDepth>(
585 options::parse_flags<> );