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>;
63 daw::not_null<typename ParsePolicy::iterator>( std::data( json_data ) );
64 auto last = daw::not_null<typename ParsePolicy::iterator>(
65 daw::data_end( json_data ) );
66 if( first != last and last[-1] == 0 ) {
71 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
75 auto parse_state = ParseState( first.get( ), last.get( ) );
77 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
79 json_details::parse_value<json_member,
81 json_member::expected_type>( parse_state );
82 parse_state.trim_left( );
84 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
88 parse_value<json_member, KnownBounds, json_member::expected_type>(
117 options::parse_flags_t<PolicyFlags...> ) {
118 static_assert( std::is_same_v<
decltype( std::data( json_data ) ),
char *>,
119 "from_json_insitu requires a mutable character buffer" );
120 return from_json<JsonMember, KnownBounds>(
121 DAW_FWD( json_data ),
122 options::parse_flags<PolicyFlags...,
123 options::AllowStringMutation::yes> );
144 options::parse_flags_t<PolicyFlags...> ) {
146 json_details::is_string_view_like_v<String>,
147 "String type must have a be a contiguous range of Characters" );
149 ErrorReason::EmptyJSONDocument );
151 using json_member = json_details::json_deduced_type<JsonMember>;
154 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
155 "Missing specialization of daw::json::json_data_contract for class "
156 "mapping or specialization of daw::json::json_link_basic_type_map" );
158 auto f = daw::not_null<char const *>( std::data( json_data ) );
159 auto l = daw::not_null<char const *>( daw::data_end( json_data ) );
167 using ParseState = json_details::apply_zstring_policy_option_t<
170 options::ZeroTerminatedString::yes>;
172 auto parse_state = ParseState::with_allocator( f.get( ), l.get( ), a );
173 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
175 json_details::parse_value<json_member,
177 json_member::expected_type>( parse_state );
178 parse_state.trim_left( );
180 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
183 return json_details::
184 parse_value<json_member, KnownBounds, json_member::expected_type>(
221 from_json( String &&json_data, std::string_view member_path,
222 options::parse_flags_t<PolicyFlags...> ) {
224 json_details::is_string_view_like_v<String>,
225 "String type must have a be a contiguous range of Characters" );
228 ErrorReason::EmptyJSONDocument );
230 ErrorReason::EmptyJSONPath );
232 ErrorReason::EmptyJSONPath );
234 using json_member = json_details::json_deduced_type<JsonMember>;
236 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
237 "Missing specialization of daw::json::json_data_contract for class "
238 "mapping or specialization of daw::json::json_link_basic_type_map" );
245 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
248 options::ZeroTerminatedString::yes>;
251 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
254 auto first = std::data( json_data );
255 auto last = daw::data_end( json_data );
256 if( first != last and last[-1] == 0 ) {
260 jv = jv.find_member( member_path );
262 if constexpr( json_details::is_json_nullable_v<json_member> ) {
264 return json_details::construct_nullable_empty<
265 json_details::json_constructor_t<json_member>>( );
270 auto parse_state = jv.get_raw_state( );
271 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
273 json_details::parse_value<json_member,
275 json_member::expected_type>( parse_state );
276 parse_state.trim_left( );
278 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
281 return json_details::
282 parse_value<json_member, KnownBounds, json_member::expected_type>(
298 [[nodiscard]]
constexpr auto from_json( String &&json_data,
299 std::string_view member_path ) {
301 json_details::is_string_view_like_v<String>,
302 "String type must have a be a contiguous range of Characters" );
304 return from_json<JsonMember, KnownBounds>(
305 DAW_FWD( json_data ), member_path, options::parse_flags<> );
322 Allocator
const &alloc,
323 options::parse_flags_t<PolicyFlags...> ) {
326 json_details::is_string_view_like_v<String>,
327 "String type must have a be a contiguous range of Characters" );
329 ErrorReason::EmptyJSONDocument );
331 ErrorReason::EmptyJSONDocument );
333 ErrorReason::EmptyJSONPath );
335 using json_member = json_details::json_deduced_type<JsonMember>;
337 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
338 "Missing specialization of daw::json::json_data_contract for class "
339 "mapping or specialization of daw::json::json_link_basic_type_map" );
346 using ParseState = json_details::apply_zstring_policy_option_t<
349 options::ZeroTerminatedString::yes>;
351 auto first = std::data( json_data );
352 auto last = daw::data_end( json_data );
353 if( first != last and last[-1] == 0 ) {
357 ParseState( first, last, first, last ).with_allocator( alloc ) );
358 jv = jv.find_member( member_path );
360 if constexpr( json_details::is_json_nullable_v<json_member> ) {
362 return json_details::construct_nullable_empty<
363 json_details::json_constructor_t<json_member>>( );
368 auto parse_state = jv.get_raw_state( );
369 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
371 json_details::parse_value<json_member,
373 json_member::expected_type>( parse_state );
374 parse_state.trim_left( );
376 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
379 return json_details::
380 parse_value<json_member, KnownBounds, json_member::expected_type>(
398 std::string_view member_path,
399 Allocator
const &alloc ) {
401 json_details::is_string_view_like_v<String>,
402 "String type must have a be a contiguous range of Characters" );
404 return from_json_alloc<JsonMember, KnownBounds>(
405 DAW_FWD( json_data ), member_path, alloc, options::parse_flags<> );
419 options::parse_flags_t<PolicyFlags...> ) {
420 using json_member = json_details::json_deduced_type<JsonMember>;
422 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
423 "Missing specialization of daw::json::json_data_contract for class "
424 "mapping or specialization of daw::json::json_link_basic_type_map" );
429 daw::conditional_t<ParsePolicy::is_default_parse_policy,
433 auto parse_state = ParseState( old_parse_state.first,
434 old_parse_state.last,
435 old_parse_state.class_first,
436 old_parse_state.class_last,
437 old_parse_state.get_allocator( ) );
439 return json_details::
440 parse_value<json_member, KnownBounds, json_member::expected_type>(
474 std::string_view member_path,
475 options::parse_flags_t<PolicyFlags...> ) {
476 using json_member = json_details::json_deduced_type<JsonMember>;
478 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
479 "Missing specialization of daw::json::json_data_contract for class "
480 "mapping or specialization of daw::json::json_link_basic_type_map" );
485 daw::conditional_t<ParsePolicy::is_default_parse_policy,
490 old_parse_state.last,
491 old_parse_state.class_first,
492 old_parse_state.class_last,
493 old_parse_state.get_allocator( ) ) );
495 jv = jv.find_member( member_path );
497 if constexpr( json_details::is_json_nullable_v<json_member> ) {
499 return json_details::construct_nullable_empty<
500 json_details::json_constructor_t<json_member>>( );
505 auto parse_state = jv.get_raw_state( );
506 return json_details::
507 parse_value<json_member, KnownBounds, json_member::expected_type>(
543 options::parse_flags_t<PolicyFlags...> ) {
545 json_details::is_string_view_like_v<String>,
546 "String type must have a be a contiguous range of Characters" );
549 ErrorReason::EmptyJSONDocument );
551 ErrorReason::EmptyJSONPath );
553 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
554 "Missing specialization of daw::json::json_data_contract for class "
555 "mapping or specialization of daw::json::json_link_basic_type_map" );
556 using element_type = json_details::json_deduced_type<JsonElement>;
557 static_assert( not std::is_same_v<element_type, void>,
558 "Unknown JsonElement type." );
561 json_base::json_array<JsonElement, Container, Constructor>;
568 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
571 options::ZeroTerminatedString::yes>;
574 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
578 ParseState{ std::data( json_data ), daw::data_end( json_data ) };
580 parse_state.trim_left_unchecked( );
581#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
583 ErrorReason::InvalidArrayStart,
587 ErrorReason::InvalidArrayStart,
590 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
592 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
593 parse_state.trim_left( );
595 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
598 return json_details::parse_value_array<parser_t, KnownBounds>(
640 options::parse_flags_t<PolicyFlags...> ) {
642 json_details::is_string_view_like_v<String>,
643 "String type must have a be a contiguous range of Characters" );
646 ErrorReason::EmptyJSONDocument );
648 ErrorReason::EmptyJSONPath );
650 ErrorReason::EmptyJSONPath );
652 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
653 "Missing specialization of daw::json::json_data_contract for class "
654 "mapping or specialization of daw::json::json_link_basic_type_map" );
655 using element_type = json_details::json_deduced_type<JsonElement>;
656 static_assert( not std::is_same_v<element_type, void>,
657 "Unknown JsonElement type." );
660 json_base::json_array<JsonElement, Container, Constructor>;
667 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
670 options::ZeroTerminatedString::yes>;
673 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
676 auto first = std::data( json_data );
677 auto last = daw::data_end( json_data );
678 if( first != last and last[-1] == 0 ) {
682 jv = jv.find_member( member_path );
684 if constexpr( json_details::is_json_nullable_v<parser_t> ) {
686 return json_details::construct_nullable_empty<
687 json_details::json_constructor_t<parser_t>>( );
692 auto parse_state = jv.get_raw_state( );
693 parse_state.trim_left_unchecked( );
694#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
696 ErrorReason::InvalidArrayStart,
700 ErrorReason::InvalidArrayStart,
703 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
705 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
706 parse_state.trim_left( );
708 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
711 return json_details::parse_value_array<parser_t, KnownBounds>(
734 json_details::is_string_view_like_v<String>,
735 "String type must have a be a contiguous range of Characters" );
737 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
738 DAW_FWD( json_data ), member_path, options::parse_flags<> );