DAW JSON Link
Loading...
Searching...
No Matches
daw_from_json.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, version 1.0. (see accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
12
17
18#include <daw/daw_data_end.h>
19#include <daw/daw_not_null.h>
20#include <daw/traits/daw_traits_conditional.h>
21
22#include <daw/stdinc/data_access.h>
23#include <daw/stdinc/move_fwd_exch.h>
24#include <string_view>
25
26namespace daw::json {
27 inline namespace DAW_JSON_VER {
28
37 template<typename JsonMember, bool KnownBounds, typename String,
38 auto... PolicyFlags>
39 [[nodiscard]] constexpr auto
40 from_json( String &&json_data, options::parse_flags_t<PolicyFlags...> ) {
41 static_assert(
42 json_details::is_string_view_like_v<String>,
43 "String type must have a be a contiguous range of Characters" );
44 daw_json_ensure( std::size( json_data ) != 0,
45 ErrorReason::EmptyJSONDocument );
46
47 static_assert(
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>;
52 using ParsePolicy =
53 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
54
56 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
57 String> ) {
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 );
64 }
65 }
66
69 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
70 ParsePolicy,
71 String,
72 options::ZeroTerminatedString::yes>;
73
74 auto first =
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 ) {
79 --last;
80 }
81
82 using ParseState =
83 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
85 policy_zstring_t>;
86
87 auto parse_state = ParseState( first.get( ), last.get( ) );
88
89 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
90 auto result =
91 json_details::parse_value<json_member,
92 KnownBounds,
93 json_member::expected_type>( parse_state );
94 parse_state.trim_left( );
96 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
97 return result;
98 } else {
99 return json_details::
100 parse_value<json_member, KnownBounds, json_member::expected_type>(
101 parse_state );
102 }
103 }
104
113 template<typename JsonMember, bool KnownBounds, typename String>
114 [[nodiscard]] constexpr auto from_json( String &&json_data ) {
115 static_assert(
116 json_details::is_string_view_like_v<String>,
117 "String type must have a be a contiguous range of Characters" );
118 return from_json<JsonMember, KnownBounds>( DAW_FWD( json_data ),
119 options::parse_flags<> );
120 }
121
125 template<typename JsonMember, bool KnownBounds, typename String,
126 auto... PolicyFlags>
127 [[nodiscard]] constexpr auto
128 from_json_insitu( String &&json_data,
129 options::parse_flags_t<PolicyFlags...> ) {
130 static_assert( std::is_same_v<decltype( std::data( json_data ) ), char *>,
131 "from_json_insitu requires a mutable character buffer" );
132 return from_json<JsonMember, KnownBounds>(
133 DAW_FWD( json_data ),
134 options::parse_flags<PolicyFlags...,
135 options::AllowStringMutation::yes> );
136 }
137
138 template<typename JsonMember, bool KnownBounds, typename String>
139 [[nodiscard]] constexpr auto from_json_insitu( String &&json_data ) {
140 return from_json_insitu<JsonMember, KnownBounds>(
141 DAW_FWD( json_data ), options::parse_flags<> );
142 }
143
152 template<typename JsonMember, bool KnownBounds, typename String,
153 typename Allocator, auto... PolicyFlags>
154 [[nodiscard]] constexpr auto
155 from_json_alloc( String &&json_data, Allocator const &alloc,
156 options::parse_flags_t<PolicyFlags...> ) {
157 static_assert(
158 json_details::is_string_view_like_v<String>,
159 "String type must have a be a contiguous range of Characters" );
160 daw_json_ensure( std::size( json_data ) != 0,
161 ErrorReason::EmptyJSONDocument );
162
163 using json_member = json_details::json_deduced_type<JsonMember>;
164
165 static_assert(
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" );
169
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 ) );
172 Allocator a = alloc;
173
174 using ParsePolicy =
175 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
176
178 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
179 String> ) {
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 );
186 }
187 }
188
191 using ParseState = json_details::apply_zstring_policy_option_t<
192 ParsePolicy,
193 String,
194 options::ZeroTerminatedString::yes>;
195
196 auto parse_state = ParseState::with_allocator( f.get( ), l.get( ), a );
197 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
198 auto result =
199 json_details::parse_value<json_member,
200 KnownBounds,
201 json_member::expected_type>( parse_state );
202 parse_state.trim_left( );
204 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
205 return result;
206 } else {
207 return json_details::
208 parse_value<json_member, KnownBounds, json_member::expected_type>(
209 parse_state );
210 }
211 }
212
221 template<typename JsonMember, bool KnownBounds, typename String,
222 typename Allocator>
223 [[nodiscard]] constexpr auto from_json_alloc( String &&json_data,
224 Allocator const &alloc ) {
225 static_assert(
226 json_details::is_string_view_like_v<String>,
227 "String type must have a be a contiguous range of Characters" );
228 return from_json_alloc<JsonMember, KnownBounds>(
229 DAW_FWD( json_data ), alloc, options::parse_flags<> );
230 }
231
242 template<typename JsonMember, bool KnownBounds, typename String,
243 auto... PolicyFlags>
244 [[nodiscard]] constexpr auto
245 from_json( String &&json_data, std::string_view member_path,
246 options::parse_flags_t<PolicyFlags...> ) {
247 static_assert(
248 json_details::is_string_view_like_v<String>,
249 "String type must have a be a contiguous range of Characters" );
250
251 daw_json_ensure( std::size( json_data ) != 0,
252 ErrorReason::EmptyJSONDocument );
253 daw_json_ensure( std::data( json_data ) != nullptr,
254 ErrorReason::EmptyJSONPath );
255 daw_json_ensure( std::data( member_path ) != nullptr,
256 ErrorReason::EmptyJSONPath );
257
258 using json_member = json_details::json_deduced_type<JsonMember>;
259 static_assert(
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" );
263
264 using ParsePolicy =
265 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
266
268 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
269 String> ) {
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 );
276 }
277 }
278
281 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
282 ParsePolicy,
283 String,
284 options::ZeroTerminatedString::yes>;
285
286 using ParseState =
287 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
289 policy_zstring_t>;
290 auto first = std::data( json_data );
291 auto last = daw::data_end( json_data );
292 if( first != last and last[-1] == 0 ) {
293 --last;
294 }
295 auto jv = basic_json_value( ParseState( first, last ) );
296 jv = jv.find_member( member_path );
297
298 if constexpr( json_details::is_json_nullable_v<json_member> ) {
299 if( not jv ) {
300 return json_details::construct_nullable_empty<
301 json_details::json_constructor_t<json_member>>( );
302 }
303 } else {
304 daw_json_ensure( jv, ErrorReason::JSONPathNotFound );
305 }
306 auto parse_state = jv.get_raw_state( );
307 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
308 auto result =
309 json_details::parse_value<json_member,
310 KnownBounds,
311 json_member::expected_type>( parse_state );
312 parse_state.trim_left( );
314 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
315 return result;
316 } else {
317 return json_details::
318 parse_value<json_member, KnownBounds, json_member::expected_type>(
319 parse_state );
320 }
321 }
322
333 template<typename JsonMember, bool KnownBounds, typename String>
334 [[nodiscard]] constexpr auto from_json( String &&json_data,
335 std::string_view member_path ) {
336 static_assert(
337 json_details::is_string_view_like_v<String>,
338 "String type must have a be a contiguous range of Characters" );
339
340 return from_json<JsonMember, KnownBounds>(
341 DAW_FWD( json_data ), member_path, options::parse_flags<> );
342 }
343
354 template<typename JsonMember, bool KnownBounds, typename String,
355 typename Allocator, auto... PolicyFlags>
356 [[nodiscard]] constexpr auto
357 from_json_alloc( String &&json_data, std::string_view member_path,
358 Allocator const &alloc,
359 options::parse_flags_t<PolicyFlags...> ) {
360
361 static_assert(
362 json_details::is_string_view_like_v<String>,
363 "String type must have a be a contiguous range of Characters" );
364 daw_json_ensure( std::size( json_data ) != 0,
365 ErrorReason::EmptyJSONDocument );
366 daw_json_ensure( std::data( json_data ) != nullptr,
367 ErrorReason::EmptyJSONDocument );
368 daw_json_ensure( std::data( member_path ) != nullptr,
369 ErrorReason::EmptyJSONPath );
370
371 using json_member = json_details::json_deduced_type<JsonMember>;
372 static_assert(
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" );
376
377 using ParsePolicy =
378 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
379
381 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
382 String> ) {
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 );
389 }
390 }
391
394 using ParseState = json_details::apply_zstring_policy_option_t<
395 ParsePolicy,
396 String,
397 options::ZeroTerminatedString::yes>;
398
399 auto first = std::data( json_data );
400 auto last = daw::data_end( json_data );
401 if( first != last and last[-1] == 0 ) {
402 --last;
403 }
404 auto jv = basic_json_value(
405 ParseState( first, last, first, last ).with_allocator( alloc ) );
406 jv = jv.find_member( member_path );
407
408 if constexpr( json_details::is_json_nullable_v<json_member> ) {
409 if( not jv ) {
410 return json_details::construct_nullable_empty<
411 json_details::json_constructor_t<json_member>>( );
412 }
413 } else {
414 daw_json_ensure( jv, ErrorReason::JSONPathNotFound );
415 }
416 auto parse_state = jv.get_raw_state( );
417 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
418 auto result =
419 json_details::parse_value<json_member,
420 KnownBounds,
421 json_member::expected_type>( parse_state );
422 parse_state.trim_left( );
424 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
425 return result;
426 } else {
427 return json_details::
428 parse_value<json_member, KnownBounds, json_member::expected_type>(
429 parse_state );
430 }
431 }
432
443 template<typename JsonMember, bool KnownBounds, typename String,
444 typename Allocator>
445 [[nodiscard]] constexpr auto from_json_alloc( String &&json_data,
446 std::string_view member_path,
447 Allocator const &alloc ) {
448 static_assert(
449 json_details::is_string_view_like_v<String>,
450 "String type must have a be a contiguous range of Characters" );
451
452 return from_json_alloc<JsonMember, KnownBounds>(
453 DAW_FWD( json_data ), member_path, alloc, options::parse_flags<> );
454 }
455
463 template<typename JsonMember, bool KnownBounds, json_options_t P,
464 typename Allocator, auto... PolicyFlags>
465 [[nodiscard]] constexpr auto
467 options::parse_flags_t<PolicyFlags...> ) {
468 using json_member = json_details::json_deduced_type<JsonMember>;
469 static_assert(
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" );
473 using ParsePolicy =
474 typename BasicParsePolicy<P, Allocator>::template SetPolicyOptions<
475 PolicyFlags...>;
476 using ParseState =
477 daw::conditional_t<ParsePolicy::is_default_parse_policy,
479 ParsePolicy>;
480 auto const old_parse_state = value.get_raw_state( );
481 // A default constructed json_value, or one from a failed find_member,
482 // has no data. The parsers require a non-null range
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>>( );
487 }
488 } else {
489 daw_json_ensure( not old_parse_state.is_null( ),
490 ErrorReason::EmptyJSONDocument );
491 }
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( ) );
497
498 return json_details::
499 parse_value<json_member, KnownBounds, json_member::expected_type>(
500 parse_state );
501 }
502
510 template<typename JsonMember, bool KnownBounds, json_options_t PolicyFlags,
511 typename Allocator>
512 [[nodiscard]] constexpr auto
514
515 return from_json<JsonMember, KnownBounds>( std::move( value ),
516 options::parse_flags<> );
517 }
518
529 template<typename JsonMember, bool KnownBounds, json_options_t P,
530 typename Allocator, auto... PolicyFlags>
531 [[nodiscard]] constexpr auto
533 std::string_view member_path,
534 options::parse_flags_t<PolicyFlags...> ) {
535 using json_member = json_details::json_deduced_type<JsonMember>;
536 static_assert(
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" );
540 using ParsePolicy =
541 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
542 auto const old_parse_state = value.get_raw_state( );
543 using ParseState =
544 daw::conditional_t<ParsePolicy::is_default_parse_policy,
546 ParsePolicy>;
547 auto jv =
548 basic_json_value( ParseState( old_parse_state.first,
549 old_parse_state.last,
550 old_parse_state.class_first,
551 old_parse_state.class_last,
552 old_parse_state.get_allocator( ) ) );
553
554 jv = jv.find_member( member_path );
555
556 if constexpr( json_details::is_json_nullable_v<json_member> ) {
557 if( not jv ) {
558 return json_details::construct_nullable_empty<
559 json_details::json_constructor_t<json_member>>( );
560 }
561 } else {
562 daw_json_ensure( jv, ErrorReason::JSONPathNotFound );
563 }
564 auto parse_state = jv.get_raw_state( );
565 return json_details::
566 parse_value<json_member, KnownBounds, json_member::expected_type>(
567 parse_state );
568 }
569
580 template<typename JsonMember, bool KnownBounds, json_options_t PolicyFlags,
581 typename Allocator>
582 [[nodiscard]] constexpr auto from_json( basic_json_value<PolicyFlags> value,
583 std::string_view member_path ) {
584 return from_json<JsonMember, KnownBounds>(
585 std::move( value ), member_path, options::parse_flags<> );
586 }
587
598 template<typename JsonElement, typename Container, typename Constructor,
599 bool KnownBounds, typename String, auto... PolicyFlags>
600 [[nodiscard]] constexpr Container
601 from_json_array( String &&json_data,
602 options::parse_flags_t<PolicyFlags...> ) {
603 static_assert(
604 json_details::is_string_view_like_v<String>,
605 "String type must have a be a contiguous range of Characters" );
606
607 daw_json_ensure( std::size( json_data ) != 0,
608 ErrorReason::EmptyJSONDocument );
609 daw_json_ensure( std::data( json_data ) != nullptr,
610 ErrorReason::EmptyJSONPath );
611 static_assert(
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." );
618
619 using parser_t =
620 json_base::json_array<JsonElement, Container, Constructor>;
621
622 using ParsePolicy =
623 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
624
626 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
627 String> ) {
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 );
634 }
635 }
636
639 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
640 ParsePolicy,
641 String,
642 options::ZeroTerminatedString::yes>;
643
644 using ParseState =
645 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
647 policy_zstring_t>;
648 auto parse_state =
649 ParseState{ std::data( json_data ), daw::data_end( json_data ) };
650
651 parse_state.trim_left_unchecked( );
652#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
653 daw_json_ensure( parse_state.is_opening_bracket_checked( ),
654 ErrorReason::InvalidArrayStart,
655 parse_state );
656#else
657 daw_json_assert_weak( parse_state.is_opening_bracket_checked( ),
658 ErrorReason::InvalidArrayStart,
659 parse_state );
660#endif
661 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
662 auto result =
663 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
664 parse_state.trim_left( );
666 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
667 return result;
668 } else {
669 return json_details::parse_value_array<parser_t, KnownBounds>(
670 parse_state );
671 }
672 }
673
684 template<typename JsonElement, typename Container, typename Constructor,
685 bool KnownBounds, typename String>
686 [[nodiscard]] constexpr Container from_json_array( String &&json_data ) {
687 static_assert(
688 json_details::is_string_view_like_v<String>,
689 "String type must have a be a contiguous range of Characters" );
690 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
691 DAW_FWD( json_data ), options::parse_flags<> );
692 }
693
707 template<typename JsonElement, typename Container, typename Constructor,
708 bool KnownBounds, typename String, auto... PolicyFlags>
709 [[nodiscard]] constexpr Container
710 from_json_array( String &&json_data, std::string_view member_path,
711 options::parse_flags_t<PolicyFlags...> ) {
712 static_assert(
713 json_details::is_string_view_like_v<String>,
714 "String type must have a be a contiguous range of Characters" );
715
716 daw_json_ensure( std::size( json_data ) != 0,
717 ErrorReason::EmptyJSONDocument );
718 daw_json_ensure( std::data( json_data ) != nullptr,
719 ErrorReason::EmptyJSONPath );
720 daw_json_ensure( std::data( member_path ) != nullptr,
721 ErrorReason::EmptyJSONPath );
722 static_assert(
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." );
729
730 using parser_t =
731 json_base::json_array<JsonElement, Container, Constructor>;
732
733 using ParsePolicy =
734 BasicParsePolicy<options::parse_flags_t<PolicyFlags...>::value>;
735
737 if constexpr( json_details::can_use_runtime_zstring_v<ParsePolicy,
738 String> ) {
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 );
745 }
746 }
747
750 using policy_zstring_t = json_details::apply_zstring_policy_option_t<
751 ParsePolicy,
752 String,
753 options::ZeroTerminatedString::yes>;
754
755 using ParseState =
756 daw::conditional_t<policy_zstring_t::is_default_parse_policy,
758 policy_zstring_t>;
759 auto first = std::data( json_data );
760 auto last = daw::data_end( json_data );
761 if( first != last and last[-1] == 0 ) {
762 --last;
763 }
764 auto jv = basic_json_value( ParseState( first, last ) );
765 jv = jv.find_member( member_path );
766
767 if constexpr( json_details::is_json_nullable_v<parser_t> ) {
768 if( not jv ) {
769 return json_details::construct_nullable_empty<
770 json_details::json_constructor_t<parser_t>>( );
771 }
772 } else {
773 daw_json_ensure( jv, ErrorReason::JSONPathNotFound );
774 }
775 auto parse_state = jv.get_raw_state( );
776 parse_state.trim_left_unchecked( );
777#if defined( DAW_JSON_BUGFIX_FROM_JSON_001 )
778 daw_json_ensure( parse_state.is_opening_bracket_checked( ),
779 ErrorReason::InvalidArrayStart,
780 parse_state );
781#else
782 daw_json_assert_weak( parse_state.is_opening_bracket_checked( ),
783 ErrorReason::InvalidArrayStart,
784 parse_state );
785#endif
786 if constexpr( ParseState::must_verify_end_of_data_is_valid ) {
787 auto result =
788 json_details::parse_value_array<parser_t, KnownBounds>( parse_state );
789 parse_state.trim_left( );
791 parse_state.empty( ), ErrorReason::InvalidEndOfValue, parse_state );
792 return result;
793 } else {
794 return json_details::parse_value_array<parser_t, KnownBounds>(
795 parse_state );
796 }
797 }
798
812 template<typename JsonElement, typename Container, typename Constructor,
813 bool KnownBounds, typename String>
814 [[nodiscard]] constexpr Container
815 from_json_array( String &&json_data, std::string_view member_path ) {
816 static_assert(
817 json_details::is_string_view_like_v<String>,
818 "String type must have a be a contiguous range of Characters" );
819
820 return from_json_array<JsonElement, Container, Constructor, KnownBounds>(
821 DAW_FWD( json_data ), member_path, options::parse_flags<> );
822 }
823 } // namespace DAW_JSON_VER
824} // namespace daw::json
#define daw_json_assert_weak(Bool,...)
Assert that Bool is true when in Checked Input mode If false pass rest of args to daw_json_error.
#define daw_json_ensure(Bool,...)
Ensure that Bool is true. If false pass rest of args to daw_json_error.
constexpr Container from_json_array(String &&json_data, options::parse_flags_t< PolicyFlags... >)
Parse JSON data where the root item is an array.
constexpr auto from_json(String &&json_data, options::parse_flags_t< PolicyFlags... >)
Construct the JSONMember from the JSON document argument.
constexpr auto from_json_alloc(String &&json_data, Allocator const &alloc, options::parse_flags_t< PolicyFlags... >)
Construct the JSONMember from the JSON document argument.
constexpr auto from_json_insitu(String &&json_data, options::parse_flags_t< PolicyFlags... >)
Parse a writable JSON buffer with string mutation enabled. The buffer must remain alive and at a stab...
string_writer grows its string with resize_and_overwrite, leaving the new bytes uninitialized,...
Handles the bounds and policy items for parsing execution and comments.
A non-owning container for arbitrary JSON values that allows movement/iteration through.
constexpr ParseState get_raw_state() const
Get a copy of the underlying parse state.
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition version.h:20