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>;
57 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
60 options::ZeroTerminatedString::yes>;
62 auto first = daw::not_null<char const *>( std::data( json_data ) );
63 auto last = daw::not_null<char const *>( daw::data_end( json_data ) );
64 if( first != last and last[-1] == 0 ) {
69 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
73 auto parse_state = ParseState( first.get( ), last.get( ) );
75 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
77 json_details::parse_value<json_member,
79 json_member::expected_type>( parse_state );
80 parse_state.trim_left( );
82 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
86 parse_value<json_member, KnownBounds, json_member::expected_type>(
120 options::parse_flags_t<PolicyFlags...> ) {
122 json_details::is_string_view_like_v<String>,
123 "String type must have a be a contiguous range of Characters" );
125 ErrorReason::EmptyJSONDocument );
127 using json_member = json_details::json_deduced_type<JsonMember>;
130 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
131 "Missing specialization of daw::json::json_data_contract for class "
132 "mapping or specialization of daw::json::json_link_basic_type_map" );
134 auto f = daw::not_null<char const *>( std::data( json_data ) );
135 auto l = daw::not_null<char const *>( daw::data_end( json_data ) );
143 using ParseState = json_details::apply_zstring_policy_option_t<
146 options::ZeroTerminatedString::yes>;
148 auto parse_state = ParseState::with_allocator( f.get( ), l.get( ), a );
149 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
151 json_details::parse_value<json_member,
153 json_member::expected_type>( parse_state );
154 parse_state.trim_left( );
156 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
159 return json_details::
160 parse_value<json_member, KnownBounds, json_member::expected_type>(
197 from_json( String &&json_data, std::string_view member_path,
198 options::parse_flags_t<PolicyFlags...> ) {
200 json_details::is_string_view_like_v<String>,
201 "String type must have a be a contiguous range of Characters" );
204 ErrorReason::EmptyJSONDocument );
206 ErrorReason::EmptyJSONPath );
208 ErrorReason::EmptyJSONPath );
210 using json_member = json_details::json_deduced_type<JsonMember>;
212 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
213 "Missing specialization of daw::json::json_data_contract for class "
214 "mapping or specialization of daw::json::json_link_basic_type_map" );
221 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
224 options::ZeroTerminatedString::yes>;
227 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
230 auto first = std::data( json_data );
231 auto last = daw::data_end( json_data );
232 if( first != last and last[-1] == 0 ) {
236 jv = jv.find_member( member_path );
238 if constexpr( json_details::is_json_nullable_v<json_member> ) {
240 return json_details::construct_nullable_empty<
241 json_details::json_constructor_t<json_member>>( );
246 auto parse_state = jv.get_raw_state( );
247 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
249 json_details::parse_value<json_member,
251 json_member::expected_type>( parse_state );
252 parse_state.trim_left( );
254 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
257 return json_details::
258 parse_value<json_member, KnownBounds, json_member::expected_type>(
274 [[nodiscard]]
constexpr auto from_json( String &&json_data,
275 std::string_view member_path ) {
277 json_details::is_string_view_like_v<String>,
278 "String type must have a be a contiguous range of Characters" );
280 return from_json<JsonMember, KnownBounds>(
281 DAW_FWD( json_data ), member_path, options::parse_flags<> );
298 Allocator
const &alloc,
299 options::parse_flags_t<PolicyFlags...> ) {
302 json_details::is_string_view_like_v<String>,
303 "String type must have a be a contiguous range of Characters" );
305 ErrorReason::EmptyJSONDocument );
307 ErrorReason::EmptyJSONDocument );
309 ErrorReason::EmptyJSONPath );
311 using json_member = json_details::json_deduced_type<JsonMember>;
313 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
314 "Missing specialization of daw::json::json_data_contract for class "
315 "mapping or specialization of daw::json::json_link_basic_type_map" );
322 using ParseState = json_details::apply_zstring_policy_option_t<
325 options::ZeroTerminatedString::yes>;
327 auto first = std::data( json_data );
328 auto last = daw::data_end( json_data );
329 if( first != last and last[-1] == 0 ) {
333 ParseState( first, last, first, last ).with_allocator( alloc ) );
334 jv = jv.find_member( member_path );
336 if constexpr( json_details::is_json_nullable_v<json_member> ) {
338 return json_details::construct_nullable_empty<
339 json_details::json_constructor_t<json_member>>( );
344 auto parse_state = jv.get_raw_state( );
345 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
347 json_details::parse_value<json_member,
349 json_member::expected_type>( parse_state );
350 parse_state.trim_left( );
352 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
355 return json_details::
356 parse_value<json_member, KnownBounds, json_member::expected_type>(
374 std::string_view member_path,
375 Allocator
const &alloc ) {
377 json_details::is_string_view_like_v<String>,
378 "String type must have a be a contiguous range of Characters" );
380 return from_json_alloc<JsonMember, KnownBounds>(
381 DAW_FWD( json_data ), member_path, alloc, options::parse_flags<> );
395 options::parse_flags_t<PolicyFlags...> ) {
396 using json_member = json_details::json_deduced_type<JsonMember>;
398 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
399 "Missing specialization of daw::json::json_data_contract for class "
400 "mapping or specialization of daw::json::json_link_basic_type_map" );
405 daw::conditional_t<ParsePolicy::is_default_parse_policy,
409 auto parse_state = ParseState( old_parse_state.first,
410 old_parse_state.last,
411 old_parse_state.class_first,
412 old_parse_state.class_last,
413 old_parse_state.get_allocator( ) );
415 return json_details::
416 parse_value<json_member, KnownBounds, json_member::expected_type>(
450 std::string_view member_path,
451 options::parse_flags_t<PolicyFlags...> ) {
452 using json_member = json_details::json_deduced_type<JsonMember>;
454 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
455 "Missing specialization of daw::json::json_data_contract for class "
456 "mapping or specialization of daw::json::json_link_basic_type_map" );
461 daw::conditional_t<ParsePolicy::is_default_parse_policy,
466 old_parse_state.last,
467 old_parse_state.class_first,
468 old_parse_state.class_last,
469 old_parse_state.get_allocator( ) ) );
471 jv = jv.find_member( member_path );
473 if constexpr( json_details::is_json_nullable_v<json_member> ) {
475 return json_details::construct_nullable_empty<
476 json_details::json_constructor_t<json_member>>( );
481 auto parse_state = jv.get_raw_state( );
482 return json_details::
483 parse_value<json_member, KnownBounds, json_member::expected_type>(
519 options::parse_flags_t<PolicyFlags...> ) {
521 json_details::is_string_view_like_v<String>,
522 "String type must have a be a contiguous range of Characters" );
525 ErrorReason::EmptyJSONDocument );
527 ErrorReason::EmptyJSONPath );
529 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
530 "Missing specialization of daw::json::json_data_contract for class "
531 "mapping or specialization of daw::json::json_link_basic_type_map" );
532 using element_type = json_details::json_deduced_type<JsonElement>;
533 static_assert( not std::is_same_v<element_type, void>,
534 "Unknown JsonElement type." );
537 json_base::json_array<JsonElement, Container, Constructor>;
544 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
547 options::ZeroTerminatedString::yes>;
550 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
554 ParseState{ std::data( json_data ), daw::data_end( json_data ) };
556 parse_state.trim_left_unchecked( );
557#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
559 ErrorReason::InvalidArrayStart,
563 ErrorReason::InvalidArrayStart,
566 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
568 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
569 parse_state.trim_left( );
571 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
574 return json_details::parse_value_array<parser_t, KnownBounds>(
616 options::parse_flags_t<PolicyFlags...> ) {
618 json_details::is_string_view_like_v<String>,
619 "String type must have a be a contiguous range of Characters" );
622 ErrorReason::EmptyJSONDocument );
624 ErrorReason::EmptyJSONPath );
626 ErrorReason::EmptyJSONPath );
628 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
629 "Missing specialization of daw::json::json_data_contract for class "
630 "mapping or specialization of daw::json::json_link_basic_type_map" );
631 using element_type = json_details::json_deduced_type<JsonElement>;
632 static_assert( not std::is_same_v<element_type, void>,
633 "Unknown JsonElement type." );
636 json_base::json_array<JsonElement, Container, Constructor>;
643 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
646 options::ZeroTerminatedString::yes>;
649 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
652 auto first = std::data( json_data );
653 auto last = daw::data_end( json_data );
654 if( first != last and last[-1] == 0 ) {
658 jv = jv.find_member( member_path );
660 if constexpr( json_details::is_json_nullable_v<parser_t> ) {
662 return json_details::construct_nullable_empty<
663 json_details::json_constructor_t<parser_t>>( );
668 auto parse_state = jv.get_raw_state( );
669 parse_state.trim_left_unchecked( );
670#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
672 ErrorReason::InvalidArrayStart,
676 ErrorReason::InvalidArrayStart,
679 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
681 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
682 parse_state.trim_left( );
684 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
687 return json_details::parse_value_array<parser_t, KnownBounds>(
710 json_details::is_string_view_like_v<String>,
711 "String type must have a be a contiguous range of Characters" );
713 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
714 DAW_FWD( json_data ), member_path, options::parse_flags<> );