40 from_json( String &&json_data, options::parse_flags_t<PolicyFlags...> ) {
42 json_details::is_string_view_like_v<String>,
43 "String type must have a be a contiguous range of Characters" );
45 ErrorReason::EmptyJSONDocument );
48 json_details::has_json_deduced_type_v<JsonMember>,
49 "Missing specialization of daw::json::json_data_contract for class "
50 "mapping or specialization of daw::json::json_link_basic_type_map" );
51 using json_member = json_details::json_deduced_type<JsonMember>;
56 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
58 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
59 constexpr auto zstring_flags =
60 options::parse_flags<PolicyFlags...,
61 options::ZeroTerminatedString::yes>;
62 return from_json<JsonMember, KnownBounds>(
63 DAW_FWD( json_data ), zstring_flags );
69 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
72 options::ZeroTerminatedString::yes>;
75 daw::not_null<typename ParsePolicy::iterator>( std::data( json_data ) );
76 auto last = daw::not_null<typename ParsePolicy::iterator>(
77 daw::data_end( json_data ) );
78 if( first != last and last[-1] == 0 ) {
83 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
87 auto parse_state = ParseState( first.get( ), last.get( ) );
89 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
91 json_details::parse_value<json_member,
93 json_member::expected_type>( parse_state );
94 parse_state.trim_left( );
96 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
100 parse_value<json_member, KnownBounds, json_member::expected_type>(
156 options::parse_flags_t<PolicyFlags...> ) {
158 json_details::is_string_view_like_v<String>,
159 "String type must have a be a contiguous range of Characters" );
161 ErrorReason::EmptyJSONDocument );
163 using json_member = json_details::json_deduced_type<JsonMember>;
166 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
167 "Missing specialization of daw::json::json_data_contract for class "
168 "mapping or specialization of daw::json::json_link_basic_type_map" );
170 auto f = daw::not_null<char const *>( std::data( json_data ) );
171 auto l = daw::not_null<char const *>( daw::data_end( json_data ) );
178 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
180 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
181 constexpr auto zstring_flags =
182 options::parse_flags<PolicyFlags...,
183 options::ZeroTerminatedString::yes>;
184 return from_json_alloc<JsonMember, KnownBounds>(
185 DAW_FWD( json_data ), alloc, zstring_flags );
191 using ParseState = json_details::apply_zstring_policy_option_t<
194 options::ZeroTerminatedString::yes>;
196 auto parse_state = ParseState::with_allocator( f.get( ), l.get( ), a );
197 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
199 json_details::parse_value<json_member,
201 json_member::expected_type>( parse_state );
202 parse_state.trim_left( );
204 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
207 return json_details::
208 parse_value<json_member, KnownBounds, json_member::expected_type>(
245 from_json( String &&json_data, std::string_view member_path,
246 options::parse_flags_t<PolicyFlags...> ) {
248 json_details::is_string_view_like_v<String>,
249 "String type must have a be a contiguous range of Characters" );
252 ErrorReason::EmptyJSONDocument );
254 ErrorReason::EmptyJSONPath );
256 ErrorReason::EmptyJSONPath );
258 using json_member = json_details::json_deduced_type<JsonMember>;
260 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
261 "Missing specialization of daw::json::json_data_contract for class "
262 "mapping or specialization of daw::json::json_link_basic_type_map" );
268 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
270 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
271 constexpr auto zstring_flags =
272 options::parse_flags<PolicyFlags...,
273 options::ZeroTerminatedString::yes>;
274 return from_json<JsonMember, KnownBounds>(
275 DAW_FWD( json_data ), member_path, zstring_flags );
281 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
284 options::ZeroTerminatedString::yes>;
287 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
290 auto first = std::data( json_data );
291 auto last = daw::data_end( json_data );
292 if( first != last and last[-1] == 0 ) {
296 jv = jv.find_member( member_path );
298 if constexpr( json_details::is_json_nullable_v<json_member> ) {
300 return json_details::construct_nullable_empty<
301 json_details::json_constructor_t<json_member>>( );
306 auto parse_state = jv.get_raw_state( );
307 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
309 json_details::parse_value<json_member,
311 json_member::expected_type>( parse_state );
312 parse_state.trim_left( );
314 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
317 return json_details::
318 parse_value<json_member, KnownBounds, json_member::expected_type>(
358 Allocator
const &alloc,
359 options::parse_flags_t<PolicyFlags...> ) {
362 json_details::is_string_view_like_v<String>,
363 "String type must have a be a contiguous range of Characters" );
365 ErrorReason::EmptyJSONDocument );
367 ErrorReason::EmptyJSONDocument );
369 ErrorReason::EmptyJSONPath );
371 using json_member = json_details::json_deduced_type<JsonMember>;
373 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
374 "Missing specialization of daw::json::json_data_contract for class "
375 "mapping or specialization of daw::json::json_link_basic_type_map" );
381 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
383 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
384 constexpr auto zstring_flags =
385 options::parse_flags<PolicyFlags...,
386 options::ZeroTerminatedString::yes>;
387 return from_json_alloc<JsonMember, KnownBounds>(
388 DAW_FWD( json_data ), member_path, alloc, zstring_flags );
394 using ParseState = json_details::apply_zstring_policy_option_t<
397 options::ZeroTerminatedString::yes>;
399 auto first = std::data( json_data );
400 auto last = daw::data_end( json_data );
401 if( first != last and last[-1] == 0 ) {
405 ParseState( first, last, first, last ).with_allocator( alloc ) );
406 jv = jv.find_member( member_path );
408 if constexpr( json_details::is_json_nullable_v<json_member> ) {
410 return json_details::construct_nullable_empty<
411 json_details::json_constructor_t<json_member>>( );
416 auto parse_state = jv.get_raw_state( );
417 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
419 json_details::parse_value<json_member,
421 json_member::expected_type>( parse_state );
422 parse_state.trim_left( );
424 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
427 return json_details::
428 parse_value<json_member, KnownBounds, json_member::expected_type>(
467 options::parse_flags_t<PolicyFlags...> ) {
468 using json_member = json_details::json_deduced_type<JsonMember>;
470 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
471 "Missing specialization of daw::json::json_data_contract for class "
472 "mapping or specialization of daw::json::json_link_basic_type_map" );
477 daw::conditional_t<ParsePolicy::is_default_parse_policy,
483 if constexpr( json_details::is_json_nullable_v<json_member> ) {
484 if( old_parse_state.is_null( ) ) {
485 return json_details::construct_nullable_empty<
486 json_details::json_constructor_t<json_member>>( );
490 ErrorReason::EmptyJSONDocument );
492 auto parse_state = ParseState( old_parse_state.first,
493 old_parse_state.last,
494 old_parse_state.class_first,
495 old_parse_state.class_last,
496 old_parse_state.get_allocator( ) );
498 return json_details::
499 parse_value<json_member, KnownBounds, json_member::expected_type>(
533 std::string_view member_path,
534 options::parse_flags_t<PolicyFlags...> ) {
535 using json_member = json_details::json_deduced_type<JsonMember>;
537 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
538 "Missing specialization of daw::json::json_data_contract for class "
539 "mapping or specialization of daw::json::json_link_basic_type_map" );
544 daw::conditional_t<ParsePolicy::is_default_parse_policy,
549 old_parse_state.last,
550 old_parse_state.class_first,
551 old_parse_state.class_last,
552 old_parse_state.get_allocator( ) ) );
554 jv = jv.find_member( member_path );
556 if constexpr( json_details::is_json_nullable_v<json_member> ) {
558 return json_details::construct_nullable_empty<
559 json_details::json_constructor_t<json_member>>( );
564 auto parse_state = jv.get_raw_state( );
565 return json_details::
566 parse_value<json_member, KnownBounds, json_member::expected_type>(
602 options::parse_flags_t<PolicyFlags...> ) {
604 json_details::is_string_view_like_v<String>,
605 "String type must have a be a contiguous range of Characters" );
608 ErrorReason::EmptyJSONDocument );
610 ErrorReason::EmptyJSONPath );
612 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
613 "Missing specialization of daw::json::json_data_contract for class "
614 "mapping or specialization of daw::json::json_link_basic_type_map" );
615 using element_type = json_details::json_deduced_type<JsonElement>;
616 static_assert( not std::is_same_v<element_type, void>,
617 "Unknown JsonElement type." );
620 json_base::json_array<JsonElement, Container, Constructor>;
626 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
628 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
629 constexpr auto zstring_flags =
630 options::parse_flags<PolicyFlags...,
631 options::ZeroTerminatedString::yes>;
632 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
633 DAW_FWD( json_data ), zstring_flags );
639 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
642 options::ZeroTerminatedString::yes>;
645 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
649 ParseState{ std::data( json_data ), daw::data_end( json_data ) };
651 parse_state.trim_left_unchecked( );
652#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
654 ErrorReason::InvalidArrayStart,
658 ErrorReason::InvalidArrayStart,
661 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
663 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
664 parse_state.trim_left( );
666 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
669 return json_details::parse_value_array<parser_t, KnownBounds>(
711 options::parse_flags_t<PolicyFlags...> ) {
713 json_details::is_string_view_like_v<String>,
714 "String type must have a be a contiguous range of Characters" );
717 ErrorReason::EmptyJSONDocument );
719 ErrorReason::EmptyJSONPath );
721 ErrorReason::EmptyJSONPath );
723 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
724 "Missing specialization of daw::json::json_data_contract for class "
725 "mapping or specialization of daw::json::json_link_basic_type_map" );
726 using element_type = json_details::json_deduced_type<JsonElement>;
727 static_assert( not std::is_same_v<element_type, void>,
728 "Unknown JsonElement type." );
731 json_base::json_array<JsonElement, Container, Constructor>;
737 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
739 if( json_details::is_runtime_zstring<ParsePolicy>( json_data ) ) {
740 constexpr auto zstring_flags =
741 options::parse_flags<PolicyFlags...,
742 options::ZeroTerminatedString::yes>;
743 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
744 DAW_FWD( json_data ), member_path, zstring_flags );
750 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
753 options::ZeroTerminatedString::yes>;
756 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
759 auto first = std::data( json_data );
760 auto last = daw::data_end( json_data );
761 if( first != last and last[-1] == 0 ) {
765 jv = jv.find_member( member_path );
767 if constexpr( json_details::is_json_nullable_v<parser_t> ) {
769 return json_details::construct_nullable_empty<
770 json_details::json_constructor_t<parser_t>>( );
775 auto parse_state = jv.get_raw_state( );
776 parse_state.trim_left_unchecked( );
777#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
779 ErrorReason::InvalidArrayStart,
783 ErrorReason::InvalidArrayStart,
786 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
788 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
789 parse_state.trim_left( );
791 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
794 return json_details::parse_value_array<parser_t, KnownBounds>(