17 #include <daw/daw_traits.h>
20 #include <string_view>
34 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
35 typename Result,
typename String>
36 [[maybe_unused, nodiscard]] constexpr
auto from_json( String &&json_data )
37 -> std::enable_if_t<json_details::is_string_view_like_v<String>, Result> {
40 ErrorReason::EmptyJSONPath );
42 ErrorReason::EmptyJSONDocument );
45 json_details::has_json_deduced_type<JsonMember>::value,
46 "Missing specialization of daw::json::json_data_contract for class "
47 "mapping or specialization of daw::json::json_link_basic_type_map" );
48 using json_member = json_details::json_deduced_type<JsonMember>;
54 using policy_zstring_t =
62 using checked_policy_t =
67 checked_policy_t( std::data( json_data ), daw::data_end( json_data ) );
69 if constexpr( checked_policy_t::must_verify_end_of_data_is_valid ) {
70 auto result = json_details::parse_value<json_member, KnownBounds>(
77 return json_details::parse_value<json_member, KnownBounds>(
92 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
93 typename Result,
typename String,
typename Allocator>
94 [[maybe_unused, nodiscard]] constexpr
auto
96 -> std::enable_if_t<json_details::is_string_view_like_v<String>, Result> {
99 ErrorReason::EmptyJSONDocument );
101 ErrorReason::EmptyJSONPath );
103 using json_member = json_details::json_deduced_type<JsonMember>;
106 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
107 "Missing specialization of daw::json::json_data_contract for class "
108 "mapping or specialization of daw::json::json_link_basic_type_map" );
110 char const *f = std::data( json_data );
111 char const *l = daw::data_end( json_data );
118 using policy_zstring_t =
126 using checked_policy_t =
131 auto parse_state = checked_policy_t::with_allocator( f, l, a );
132 if constexpr( checked_policy_t::must_verify_end_of_data_is_valid ) {
133 auto result = json_details::parse_value<json_member, KnownBounds>(
140 return json_details::parse_value<json_member, KnownBounds>(
157 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
158 typename Result,
typename String>
159 [[maybe_unused, nodiscard]] constexpr
auto
160 from_json( String &&json_data, std::string_view member_path )
161 -> std::enable_if_t<json_details::is_string_view_like_v<String>, Result> {
164 ErrorReason::EmptyJSONDocument );
166 ErrorReason::EmptyJSONPath );
168 ErrorReason::EmptyJSONPath );
170 using json_member = json_details::json_deduced_type<JsonMember>;
172 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
173 "Missing specialization of daw::json::json_data_contract for class "
174 "mapping or specialization of daw::json::json_link_basic_type_map" );
180 using policy_zstring_t =
188 using checked_policy_t =
193 auto [is_found,
parse_state] = json_details::find_range<checked_policy_t>(
194 json_data, { std::data( member_path ), std::size( member_path ) } );
197 return typename json_member::constructor_t{ }( );
203 if constexpr( checked_policy_t::must_verify_end_of_data_is_valid ) {
204 auto result = json_details::parse_value<json_member, KnownBounds>(
211 return json_details::parse_value<json_member, KnownBounds>(
228 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
229 typename Result,
typename String,
typename Allocator>
230 [[maybe_unused, nodiscard]] constexpr
auto
232 Allocator
const &alloc )
233 -> std::enable_if_t<json_details::is_string_view_like_v<String>, Result> {
236 ErrorReason::EmptyJSONDocument );
238 ErrorReason::EmptyJSONDocument );
240 ErrorReason::EmptyJSONPath );
242 using json_member = json_details::json_deduced_type<JsonMember>;
244 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
245 "Missing specialization of daw::json::json_data_contract for class "
246 "mapping or specialization of daw::json::json_link_basic_type_map" );
253 using policy_zstring_t =
261 using checked_policy_t =
266 auto [is_found,
parse_state] = json_details::find_range<checked_policy_t>(
267 json_data, { std::data( member_path ), std::size( member_path ) }, a );
270 return typename json_member::constructor_t{ }( );
276 if constexpr( checked_policy_t::must_verify_end_of_data_is_valid ) {
277 auto result = json_details::parse_value<json_member, KnownBounds>(
284 return json_details::parse_value<json_member, KnownBounds>(
298 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
299 typename Result,
typename ParseState>
300 [[maybe_unused, nodiscard]]
inline constexpr Result
302 using json_member = json_details::json_deduced_type<JsonMember>;
304 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
305 "Missing specialization of daw::json::json_data_contract for class "
306 "mapping or specialization of daw::json::json_link_basic_type_map" );
309 ParsePolicy( std::data( json_data ), daw::data_end( json_data ) );
311 return json_details::parse_value<json_member, KnownBounds>(
327 template<
typename JsonMember,
typename ParsePolicy,
bool KnownBounds,
328 typename Result,
typename ParseState>
329 [[maybe_unused, nodiscard]] constexpr Result
331 std::string_view member_path ) {
332 using json_member = json_details::json_deduced_type<JsonMember>;
334 json_details::has_unnamed_default_type_mapping_v<JsonMember>,
335 "Missing specialization of daw::json::json_data_contract for class "
336 "mapping or specialization of daw::json::json_link_basic_type_map" );
338 auto [is_found,
parse_state] = json_details::find_range<ParsePolicy>(
339 json_data, { std::data( member_path ), std::size( member_path ) } );
342 return typename json_member::constructor_t{ }( );
347 return json_details::parse_value<json_member, KnownBounds>(
366 template<
typename JsonElement,
typename Container,
typename ParsePolicy,
367 typename Constructor,
bool KnownBounds,
typename String>
368 [[maybe_unused, nodiscard]] constexpr
auto
370 -> std::enable_if_t<json_details::is_string_view_like_v<String>,
374 ErrorReason::EmptyJSONDocument );
376 ErrorReason::EmptyJSONPath );
378 ErrorReason::EmptyJSONPath );
380 json_details::has_unnamed_default_type_mapping_v<JsonElement>,
381 "Missing specialization of daw::json::json_data_contract for class "
382 "mapping or specialization of daw::json::json_link_basic_type_map" );
383 using element_type = json_details::json_deduced_type<JsonElement>;
384 static_assert( traits::not_same<element_type, void>::value,
385 "Unknown JsonElement type." );
388 json_base::json_array<JsonElement, Container, Constructor>;
394 using policy_zstring_t =
402 using checked_policy_t =
407 auto [is_found,
parse_state] = json_details::find_range<checked_policy_t>(
408 json_data, { std::data( member_path ), std::size( member_path ) } );
412 return typename parser_t::constructor_t{ }( );
418 #if defined( _MSC_VER ) and not defined( __clang__ )
423 using ParseState = daw::remove_cvref_t<decltype(
parse_state )>;
427 if constexpr( checked_policy_t::must_verify_end_of_data_is_valid ) {
428 auto result = json_details::parse_value<parser_t, KnownBounds>(
435 return json_details::parse_value<parser_t, KnownBounds>(
Definition: daw_json_value.h:316
constexpr std::string_view get_string_view() const
Definition: daw_json_value.h:444
constexpr ParseState get_state() const
Definition: daw_json_value.h:454
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
ParseState & parse_state
Definition: daw_json_parse_class.h:201
std::conditional_t< ParsePolicy::allow_temporarily_mutating_buffer, std::conditional_t< is_mutable_string_v< String >, apply_policy_option_t< ParsePolicy, OptionMutable >, apply_policy_option_t< ParsePolicy, OptionImmutable > >, std::conditional_t<(is_rvalue_string< String > and is_mutable_string_v< String >), apply_policy_option_t< ParsePolicy, OptionMutable >, apply_policy_option_t< ParsePolicy, OptionImmutable > >> apply_mutable_policy
Definition: daw_json_traits.h:555
std::conditional_t< is_zero_terminated_string_v< daw::remove_cvref_t< String > >, apply_policy_option_t< ParsePolicy, Option >, ParsePolicy > apply_zstring_policy_option_t
Definition: daw_json_traits.h:526
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
constexpr auto from_json_alloc(String &&json_data, Allocator const &alloc) -> std::enable_if_t< json_details::is_string_view_like_v< String >, Result >
Definition: daw_from_json.h:95
constexpr auto from_json_array(String &&json_data, std::string_view member_path) -> std::enable_if_t< json_details::is_string_view_like_v< String >, Container >
Definition: daw_from_json.h:369
constexpr auto from_json(String &&json_data) -> std::enable_if_t< json_details::is_string_view_like_v< String >, Result >
Definition: daw_from_json.h:36
Definition: daw_from_json.h:22
#define DAW_JSON_VER
Definition: version.h:11