19 namespace json_details {
20 struct handler_result_holder {
23 constexpr handler_result_holder( ) =
default;
25 constexpr handler_result_holder(
bool b )
31 constexpr
explicit operator bool( )
const {
36 namespace hnd_checks {
38 template<
typename Handler,
typename Range>
39 using has_on_value_handler_detect =
40 decltype( std::declval<Handler>( ).handle_on_value(
43 template<
typename Handler,
typename Range>
44 inline constexpr
bool has_on_value_handler_v =
45 daw::is_detected_v<has_on_value_handler_detect, Handler, Range>;
48 template<
typename Handler,
typename Range>
49 using has_on_array_start_handler_detect =
50 decltype( std::declval<Handler>( ).handle_on_array_start(
53 template<
typename Handler,
typename Range>
54 inline constexpr
bool has_on_array_start_handler_v =
55 daw::is_detected_v<has_on_array_start_handler_detect, Handler, Range>;
58 template<
typename Handler>
59 using has_on_array_end_handler_detect =
60 decltype( std::declval<Handler>( ).handle_on_array_end( ) );
62 template<
typename Handler>
63 inline constexpr
bool has_on_array_end_handler_v =
64 daw::is_detected_v<has_on_array_end_handler_detect, Handler>;
67 template<
typename Handler,
typename Range>
68 using has_on_class_start_handler_detect =
69 decltype( std::declval<Handler>( ).handle_on_class_start(
72 template<
typename Handler,
typename Range>
73 inline constexpr
bool has_on_class_start_handler_v =
74 daw::is_detected_v<has_on_class_start_handler_detect, Handler, Range>;
77 template<
typename Handler>
78 using has_on_class_end_handler_detect =
79 decltype( std::declval<Handler>( ).handle_on_class_end( ) );
81 template<
typename Handler>
82 inline constexpr
bool has_on_class_end_handler_v =
83 daw::is_detected_v<has_on_class_end_handler_detect, Handler>;
86 template<
typename Handler,
typename Range>
87 using has_on_number_handler_detect_jv =
88 decltype( std::declval<Handler>( ).handle_on_number(
91 template<
typename Handler,
typename Range>
92 inline constexpr
bool has_on_number_handler_jv_v =
93 daw::is_detected_v<has_on_number_handler_detect_jv, Handler, Range>;
95 template<
typename Handler>
96 using has_on_number_handler_detect_dbl =
97 decltype( std::declval<Handler>( ).handle_on_number( 0.0 ) );
99 template<
typename Handler>
100 inline constexpr
bool has_on_number_handler_dbl_v =
101 daw::is_detected_v<has_on_number_handler_detect_dbl, Handler>;
104 template<
typename Handler,
typename Range>
105 using has_on_bool_handler_detect_jv =
106 decltype( std::declval<Handler>( ).handle_on_bool(
109 template<
typename Handler,
typename Range>
110 inline constexpr
bool has_on_bool_handler_jv_v =
111 daw::is_detected_v<has_on_bool_handler_detect_jv, Handler, Range>;
113 template<
typename Handler>
114 using has_on_bool_handler_detect_bl =
115 decltype( std::declval<Handler>( ).handle_on_bool(
true ) );
117 template<
typename Handler>
118 inline constexpr
bool has_on_bool_handler_bl_v =
119 daw::is_detected_v<has_on_bool_handler_detect_bl, Handler>;
122 template<
typename Handler,
typename Range>
123 using has_on_string_handler_detect_jv =
124 decltype( std::declval<Handler>( ).handle_on_string(
127 template<
typename Handler,
typename Range>
128 inline constexpr
bool has_on_string_handler_jv_v =
129 daw::is_detected_v<has_on_string_handler_detect_jv, Handler, Range>;
131 template<
typename Handler>
132 using has_on_string_handler_detect_str =
133 decltype( std::declval<Handler>( ).handle_on_string(
134 std::declval<std::string>( ) ) );
136 template<
typename Handler>
137 inline constexpr
bool has_on_string_handler_str_v =
138 daw::is_detected_v<has_on_string_handler_detect_str, Handler>;
141 template<
typename Handler,
typename Range>
142 using has_on_null_handler_detect_jv =
143 decltype( std::declval<Handler>( ).handle_on_null(
146 template<
typename Handler,
typename Range>
147 inline constexpr
bool has_on_null_handler_jv_v =
148 daw::is_detected_v<has_on_null_handler_detect_jv, Handler, Range>;
150 template<
typename Handler>
151 using has_on_null_handler_detect =
152 decltype( std::declval<Handler>( ).handle_on_null( ) );
154 template<
typename Handler>
155 inline constexpr
bool has_on_null_handler_v =
156 daw::is_detected_v<has_on_null_handler_detect, Handler>;
159 template<
typename Handler,
typename Range>
160 using has_on_error_handler_detect =
161 decltype( std::declval<Handler>( ).handle_on_error(
164 template<
typename Handler,
typename Range>
165 inline constexpr
bool has_on_error_handler_v =
166 daw::is_detected_v<has_on_error_handler_detect, Handler, Range>;
170 constexpr daw::remove_cvref_t<T> as_copy( T &&value ) {
174 template<
typename Handler,
typename ParsePolicy>
175 inline constexpr handler_result_holder
176 handle_on_value( Handler &&handler,
178 if constexpr( hnd_checks::has_on_value_handler_v<Handler, ParsePolicy> ) {
179 return handler.handle_on_value( std::move( p ) );
182 return handler_result_holder{ };
186 template<
typename Handler,
typename Range>
187 inline constexpr handler_result_holder
188 handle_on_array_start( Handler &&handler,
190 if constexpr( hnd_checks::has_on_array_start_handler_v<Handler, Range> ) {
191 return handler.handle_on_array_start( std::move( jv ) );
194 return handler_result_holder{ };
198 template<
typename Handler>
199 inline constexpr handler_result_holder
200 handle_on_array_end( Handler &&handler ) {
201 if constexpr( hnd_checks::has_on_array_end_handler_v<Handler> ) {
202 return handler.handle_on_array_end( );
204 return handler_result_holder{ };
208 template<
typename Handler,
typename Range>
209 inline constexpr handler_result_holder
210 handle_on_class_start( Handler &&handler,
212 if constexpr( hnd_checks::has_on_class_start_handler_v<Handler, Range> ) {
213 return handler.handle_on_class_start( std::move( jv ) );
216 return handler_result_holder{ };
220 template<
typename Handler>
221 inline constexpr handler_result_holder
222 handle_on_class_end( Handler &&handler ) {
223 if constexpr( hnd_checks::has_on_class_end_handler_v<Handler> ) {
224 return handler.handle_on_class_end( );
226 return handler_result_holder{ };
230 template<
typename Handler,
typename Range>
231 inline constexpr handler_result_holder
232 handle_on_number( Handler &&handler,
234 if constexpr( hnd_checks::has_on_number_handler_jv_v<Handler, Range> ) {
235 return handler.handle_on_number( as_copy( jv ) );
236 }
else if constexpr( hnd_checks::has_on_number_handler_dbl_v<Handler> ) {
237 return handler.handle_on_number( from_json<double>( jv ) );
240 return handler_result_holder{ };
244 template<
typename Handler,
typename Range>
245 inline constexpr handler_result_holder
247 if constexpr( hnd_checks::has_on_bool_handler_jv_v<Handler, Range> ) {
248 return handler.handle_on_bool( as_copy( jv ) );
249 }
else if constexpr( hnd_checks::has_on_bool_handler_bl_v<Handler> ) {
250 return handler.handle_on_bool( from_json<bool>( jv ) );
253 return handler_result_holder{ };
257 template<
typename Handler,
typename Range>
258 inline constexpr handler_result_holder
259 handle_on_string( Handler &&handler,
261 if constexpr( hnd_checks::has_on_string_handler_jv_v<Handler, Range> ) {
262 return handler.handle_on_string( as_copy( jv ) );
263 }
else if constexpr( hnd_checks::has_on_string_handler_str_v<Handler> ) {
264 return handler.handle_on_string( jv.
get_string( ) );
267 return handler_result_holder{ };
271 template<
typename Handler,
typename Range>
272 inline constexpr handler_result_holder
273 handle_on_null( Handler &&handler,
275 if constexpr( hnd_checks::has_on_null_handler_jv_v<Handler, Range> ) {
276 return handler.handle_on_null( as_copy( jv ) );
277 }
else if constexpr( hnd_checks::has_on_null_handler_v<Handler> ) {
278 return handler.handle_on_null( );
280 return handler_result_holder{ };
284 template<
typename Handler,
typename Range>
285 inline constexpr handler_result_holder
286 handle_on_error( Handler &&handler,
288 if constexpr( hnd_checks::has_on_error_handler_v<Handler, Range> ) {
289 return handler.handle_on_error( std::move( jv ) );
292 return handler_result_holder{ };
299 template<
typename ParsePolicy>
303 std::pair<iterator, iterator>
value;
306 template<
typename StackValue>
308 std::vector<StackValue> m_stack{ };
319 m_stack.push_back( std::move( v ) );
323 return m_stack.back( );
335 return m_stack.empty( );
340 typename StackContainerPolicy = DefaultJsonEventParserStackPolicy<
341 JsonEventParserStackValue<ParsePolicy>>,
343 inline constexpr
void
345 Handler &&handler ) {
350 auto parent_stack = StackContainerPolicy( );
352 auto const move_to_last = [&]( ) {
353 parent_stack.back( ).value.first = parent_stack.back( ).value.second;
356 auto const process_value = [&]( json_value_t p ) {
358 auto result = json_details::handle_on_value( handler, p );
359 switch( result.value ) {
361 parent_stack.clear( );
372 switch( jv.
type( ) ) {
373 case daw::json::JsonBaseParseTypes::Array: {
374 auto result = json_details::handle_on_array_start( handler, jv );
375 switch( result.value ) {
377 parent_stack.clear( );
385 parent_stack.push_back(
387 std::pair<iterator, iterator>( jv.
begin( ), jv.
end( ) ) } );
389 case daw::json::JsonBaseParseTypes::Class: {
390 auto result = json_details::handle_on_class_start( handler, jv );
391 switch( result.value ) {
393 parent_stack.clear( );
401 parent_stack.push_back(
402 { StackRangeType::Class,
403 std::pair<iterator, iterator>( jv.
begin( ), jv.
end( ) ) } );
405 case daw::json::JsonBaseParseTypes::Number: {
406 auto result = json_details::handle_on_number( handler, jv );
407 switch( result.value ) {
409 parent_stack.clear( );
418 case daw::json::JsonBaseParseTypes::Bool: {
419 auto result = json_details::handle_on_bool( handler, jv );
420 switch( result.value ) {
422 parent_stack.clear( );
431 case daw::json::JsonBaseParseTypes::String: {
432 auto result = json_details::handle_on_string( handler, jv );
433 switch( result.value ) {
435 parent_stack.clear( );
444 case daw::json::JsonBaseParseTypes::Null: {
445 auto result = json_details::handle_on_null( handler, jv );
446 switch( result.value ) {
448 parent_stack.clear( );
459 auto result = json_details::handle_on_error( handler, jv );
460 switch( result.value ) {
462 parent_stack.clear( );
474 auto const process_range = [&]( stack_value_t v ) {
475 if( v.value.first != v.value.second ) {
476 auto jv = *v.value.first;
478 parent_stack.push_back( std::move( v ) );
479 process_value( std::move( jv ) );
482 case StackRangeType::Class: {
483 auto result = json_details::handle_on_class_end( handler );
484 switch( result.value ) {
486 parent_stack.clear( );
494 auto result = json_details::handle_on_array_end( handler );
495 switch( result.value ) {
497 parent_stack.clear( );
508 process_value( { std::nullopt, std::move( jvalue ) } );
510 while( not parent_stack.empty( ) ) {
511 auto v = std::move( parent_stack.back( ) );
512 parent_stack.pop_back( );
520 Handler &&handler ) {
522 std::forward<Handler>( handler ) );