39 namespace json_details {
40 struct handler_result_holder {
41 json_parse_handler_result value = json_parse_handler_result::Continue;
43 handler_result_holder( ) =
default;
45 constexpr handler_result_holder(
bool b )
46 : value( b ? Continue : Complete ) {}
48 constexpr handler_result_holder( json_parse_handler_result r )
51 constexpr explicit operator bool( )
const {
52 return value == json_parse_handler_result::Continue;
56 namespace hnd_checks {
59 has_on_value_handler_impl,
60 std::declval<T>( ).handle_on_value( std::declval<U>( ) ) );
62 template<
typename Handler, json_options_t,
typename JPair>
63 DAW_CPP20_CONCEPT has_on_value_handler_v =
64 has_on_value_handler_impl<Handler, JPair>;
68 has_on_array_start_handler_impl,
69 std::declval<T>( ).handle_on_array_start( std::declval<U>( ) ) );
71 template<
typename Handler, json_options_t ,
typename JValue>
72 DAW_CPP20_CONCEPT has_on_array_start_handler_v =
73 has_on_array_start_handler_impl<Handler, JValue>;
77 std::declval<T>( ).handle_on_array_end( ) );
81 has_on_class_start_handler_impl,
82 std::declval<T>( ).handle_on_class_start( std::declval<U>( ) ) );
84 template<
typename Handler, json_options_t ,
typename JValue>
85 DAW_CPP20_CONCEPT has_on_class_start_handler_v =
86 has_on_class_start_handler_impl<Handler, JValue>;
90 std::declval<T>( ).handle_on_class_end( ) );
94 has_on_number_handler_jv_impl,
95 std::declval<T>( ).handle_on_number( std::declval<U>( ) ) );
97 template<
typename Handler, json_options_t P,
typename A>
98 DAW_CPP20_CONCEPT has_on_number_handler_jv_v =
99 has_on_number_handler_jv_impl<Handler, basic_json_value<P, A>>;
102 std::declval<T>( ).handle_on_number( 0.0 ) );
106 has_on_bool_handler_jv_impl,
107 std::declval<T>( ).handle_on_bool( std::declval<U>( ) ) );
109 template<
typename Handler, json_options_t P,
typename A>
110 DAW_CPP20_CONCEPT has_on_bool_handler_jv_v =
111 has_on_bool_handler_jv_impl<Handler, basic_json_value<P, A>>;
114 std::declval<T>( ).handle_on_bool(
true ) );
118 has_on_string_handler_impl,
119 std::declval<T>( ).handle_on_string( std::declval<U>( ) ) );
121 template<
typename Handler, json_options_t P,
typename A>
122 DAW_CPP20_CONCEPT has_on_string_handler_jv_v =
123 has_on_string_handler_impl<Handler, basic_json_value<P, A>>;
126 has_on_string_handler_str_v,
127 std::declval<T>( ).handle_on_string( std::declval<std::string>( ) ) );
131 has_on_null_handler_impl,
132 std::declval<T>( ).handle_on_null( std::declval<U>( ) ) );
134 template<
typename Handler, json_options_t P,
typename A>
135 DAW_CPP20_CONCEPT has_on_null_handler_jv_v =
136 has_on_null_handler_impl<Handler, basic_json_value<P, A>>;
139 std::declval<T>( ).handle_on_null( ) );
143 has_on_error_handler_impl,
144 std::declval<T>( ).handle_on_error( std::declval<U>( ) ) );
146 template<
typename Handler, json_options_t P,
typename A>
147 DAW_CPP20_CONCEPT has_on_error_handler_v =
148 has_on_error_handler_impl<Handler, basic_json_value<P, A>>;
152 constexpr daw::remove_cvref_t<T> as_copy( T &&value ) {
156 template<
typename Handler, json_options_t P,
typename A>
157 constexpr handler_result_holder
158 handle_on_value( Handler &&handler, basic_json_pair<P, A> p ) {
159 if constexpr( hnd_checks::has_on_value_handler_v<Handler, P, A> ) {
160 return handler.handle_on_value( std::move( p ) );
163 return handler_result_holder{ };
167 template<
typename Handler, json_options_t P,
typename A>
168 constexpr handler_result_holder
169 handle_on_array_start( Handler &&handler, basic_json_value<P, A> jv ) {
170 if constexpr( hnd_checks::
171 has_on_array_start_handler_v<Handler, P, A> ) {
172 return handler.handle_on_array_start( std::move( jv ) );
175 return handler_result_holder{ };
179 template<
typename Handler>
180 constexpr handler_result_holder handle_on_array_end( Handler &&handler ) {
181 if constexpr( hnd_checks::has_on_array_end_handler_v<Handler> ) {
182 return handler.handle_on_array_end( );
184 return handler_result_holder{ };
188 template<
typename Handler, json_options_t P,
typename A>
189 constexpr handler_result_holder
190 handle_on_class_start( Handler &&handler, basic_json_value<P, A> jv ) {
191 if constexpr( hnd_checks::
192 has_on_class_start_handler_v<Handler, P, A> ) {
193 return handler.handle_on_class_start( std::move( jv ) );
196 return handler_result_holder{ };
200 template<
typename Handler>
201 constexpr handler_result_holder handle_on_class_end( Handler &&handler ) {
202 if constexpr( hnd_checks::has_on_class_end_handler_v<Handler> ) {
203 return handler.handle_on_class_end( );
205 return handler_result_holder{ };
209 template<
typename Handler, json_options_t P,
typename A>
210 constexpr handler_result_holder
211 handle_on_number( Handler &&handler, basic_json_value<P, A> &jv ) {
212 if constexpr( hnd_checks::has_on_number_handler_jv_v<Handler, P, A> ) {
213 return handler.handle_on_number( as_copy( jv ) );
214 }
else if constexpr( hnd_checks::has_on_number_handler_dbl_v<
216 return handler.handle_on_number( from_json<double>( jv ) );
219 return handler_result_holder{ };
223 template<
typename Handler, json_options_t P,
typename A>
224 constexpr handler_result_holder
225 handle_on_bool( Handler &&handler, basic_json_value<P, A> jv ) {
226 if constexpr( hnd_checks::has_on_bool_handler_jv_v<Handler, P, A> ) {
227 return handler.handle_on_bool( as_copy( jv ) );
228 }
else if constexpr( hnd_checks::has_on_bool_handler_bl_v<Handler> ) {
229 return handler.handle_on_bool( from_json<bool>( jv ) );
232 return handler_result_holder{ };
236 template<
typename Handler, json_options_t P,
typename A>
237 constexpr handler_result_holder
238 handle_on_string( Handler &&handler, basic_json_value<P, A> &jv ) {
239 if constexpr( hnd_checks::has_on_string_handler_jv_v<Handler, P, A> ) {
240 return handler.handle_on_string( as_copy( jv ) );
241 }
else if constexpr( hnd_checks::has_on_string_handler_str_v<
243 return handler.handle_on_string( jv.get_string( ) );
246 return handler_result_holder{ };
250 template<
typename Handler, json_options_t P,
typename A>
251 constexpr handler_result_holder
252 handle_on_null( Handler &&handler, basic_json_value<P, A> &jv ) {
253 if constexpr( hnd_checks::has_on_null_handler_jv_v<Handler, P, A> ) {
254 return handler.handle_on_null( as_copy( jv ) );
255 }
else if constexpr( hnd_checks::has_on_null_handler_v<Handler> ) {
256 return handler.handle_on_null( );
258 return handler_result_holder{ };
262 template<
typename Handler, json_options_t P,
typename A>
263 constexpr handler_result_holder
264 handle_on_error( Handler &&handler, basic_json_value<P, A> jv ) {
265 if constexpr( hnd_checks::has_on_error_handler_v<Handler, P, A> ) {
266 return handler.handle_on_error( std::move( jv ) );
269 return handler_result_holder{ };
277 template<json_options_t P,
typename A>
281 std::pair<iterator, iterator>
value;
284 template<
typename StackValue,
typename StackType = std::vector<StackValue>>
298 m_stack.push_back( std::move( v ) );
302 return m_stack.back( );
314 return m_stack.empty( );
318 template<
typename StackContainerPolicy = use_default,
json_options_t P,
319 typename A,
typename Handler,
auto... ParseFlags>
322 options::parse_flags_t<ParseFlags...> ) {
326 template SetPolicyOptions<ParseFlags...>>;
330 using json_value_t =
typename iterator::json_pair;
331 using stack_value_t =
335 auto parent_stack = [] DAW_CPP23_STATIC_CALL_OP {
336 if constexpr( std::is_same_v<StackContainerPolicy, use_default> ) {
339 return StackContainerPolicy{ };
342 long long class_depth = 0;
343 long long array_depth = 0;
345 auto const move_to_last = [&]( ) {
346 parent_stack.
back( ).value.first = parent_stack.back( ).value.second;
349 auto const process_value = [&]( json_value_t p ) {
351 auto result = json_details::handle_on_value( handler, p );
352 switch( result.value ) {
353 case json_parse_handler_result::Complete:
354 parent_stack.clear( );
356 case json_parse_handler_result::SkipClassArray:
359 case json_parse_handler_result::Continue:
365 switch( jv.type( ) ) {
366 case JsonBaseParseTypes::Array: {
368 auto result = json_details::handle_on_array_start( handler, jv );
369 switch( result.value ) {
370 case json_parse_handler_result::Complete:
371 parent_stack.clear( );
373 case json_parse_handler_result::SkipClassArray:
376 case json_parse_handler_result::Continue:
379 parent_stack.push_back(
380 { StackParseStateType::Array,
381 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
383 case JsonBaseParseTypes::Class: {
385 auto result = json_details::handle_on_class_start( handler, jv );
386 switch( result.value ) {
387 case json_parse_handler_result::Complete:
388 parent_stack.clear( );
390 case json_parse_handler_result::SkipClassArray:
393 case json_parse_handler_result::Continue:
396 parent_stack.push_back(
397 { StackParseStateType::Class,
398 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
400 case JsonBaseParseTypes::Number: {
401 auto result = json_details::handle_on_number( handler, jv );
402 switch( result.value ) {
403 case json_parse_handler_result::Complete:
404 parent_stack.clear( );
406 case json_parse_handler_result::SkipClassArray:
409 case json_parse_handler_result::Continue:
413 case JsonBaseParseTypes::Bool: {
414 auto result = json_details::handle_on_bool( handler, jv );
415 switch( result.value ) {
416 case json_parse_handler_result::Complete:
417 parent_stack.clear( );
419 case json_parse_handler_result::SkipClassArray:
422 case json_parse_handler_result::Continue:
426 case JsonBaseParseTypes::String: {
427 auto result = json_details::handle_on_string( handler, jv );
428 switch( result.value ) {
429 case json_parse_handler_result::Complete:
430 parent_stack.clear( );
432 case json_parse_handler_result::SkipClassArray:
435 case json_parse_handler_result::Continue:
439 case JsonBaseParseTypes::Null: {
440 auto result = json_details::handle_on_null( handler, jv );
441 switch( result.value ) {
442 case json_parse_handler_result::Complete:
443 parent_stack.clear( );
445 case json_parse_handler_result::SkipClassArray:
448 case json_parse_handler_result::Continue:
452 case JsonBaseParseTypes::None:
454 auto result = json_details::handle_on_error( handler, jv );
455 switch( result.value ) {
456 case json_parse_handler_result::Complete:
457 parent_stack.clear( );
459 case json_parse_handler_result::SkipClassArray:
462 case json_parse_handler_result::Continue:
469 auto const process_range = [&]( stack_value_t v ) {
470 if( v.value.first != v.value.second ) {
471 auto jv = *v.value.first;
473 parent_stack.push_back( std::move( v ) );
474 process_value( std::move( jv ) );
477 case StackParseStateType::Class: {
479 ( class_depth > 0 ) &
480 ( v.value.first.get_raw_state( ).has_more( ) and
481 v.value.first.get_raw_state( ).front( ) ==
'}' ),
482 ErrorReason::InvalidEndOfValue );
484 auto result = json_details::handle_on_class_end( handler );
485 switch( result.value ) {
486 case json_parse_handler_result::Complete:
487 parent_stack.clear( );
489 case json_parse_handler_result::SkipClassArray:
490 case json_parse_handler_result::Continue:
494 case StackParseStateType::Array: {
496 ( array_depth > 0 ) &
497 ( v.value.first.get_raw_state( ).has_more( ) and
498 v.value.first.get_raw_state( ).front( ) ==
']' ),
499 ErrorReason::InvalidEndOfValue );
501 auto result = json_details::handle_on_array_end( handler );
502 switch( result.value ) {
503 case json_parse_handler_result::Complete:
504 parent_stack.clear( );
506 case json_parse_handler_result::SkipClassArray:
507 case json_parse_handler_result::Continue:
515 process_value( json_value_t{ std::nullopt, std::move( jvalue ) } );
517 while( not parent_stack.empty( ) ) {
518 auto v = std::move( parent_stack.back( ) );
519 parent_stack.pop_back( );
523 ErrorReason::InvalidEndOfValue );
526 template<
typename StackContainerPolicy = use_default, json_options_t P,
527 typename A,
typename Handler>
528 DAW_ATTRIB_INLINE
constexpr void
530 json_event_parser<StackContainerPolicy>(
531 std::move( bjv ), DAW_FWD( handler ), options::parse_flags<> );
534 template<
typename StackContainerPolicy = use_default,
typename Handler,
536 DAW_ATTRIB_INLINE
void
538 options::parse_flags_t<ParseFlags...> pflags ) {
540 return json_event_parser<StackContainerPolicy>(
544 template<
typename StackContainerPolicy = use_default,
typename Handler>
546 Handler &&handler ) {
548 return json_event_parser<StackContainerPolicy>(
551 options::parse_flags<> );