DAW JSON Link
daw_json_link_types_fwd.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 
11 #include "daw_json_enums.h"
13 #include "daw_json_parse_class.h"
14 #include "daw_json_parse_name.h"
16 #include "daw_json_traits.h"
17 #include "version.h"
18 
19 #include <daw/cpp_17.h>
20 #include <daw/daw_arith_traits.h>
21 #include <daw/daw_fwd_pack_apply.h>
22 #include <daw/daw_traits.h>
23 #include <daw/daw_utility.h>
24 
25 #include <chrono>
26 #include <ciso646>
27 #include <optional>
28 #include <string>
29 
30 namespace daw::json {
31  inline namespace DAW_JSON_VER {
48  template<JSONNAMETYPE Name, typename T,
49  typename Constructor = default_constructor<T>,
51  struct json_class;
52 
61  template<JSONNAMETYPE Name, typename T,
62  typename Constructor = nullable_constructor<T>,
65  json_class<Name, T, Constructor,
66  json_details::class_opts_set<Options, JsonNullDefault>>;
67 
78  template<JSONNAMETYPE Name, typename T = double,
80  typename Constructor = default_constructor<T>>
81  struct json_number;
91  template<JSONNAMETYPE Name, typename T = std::optional<double>,
92  json_details::json_options_t Options = number_opts_def,
93  typename Constructor = nullable_constructor<T>>
95  json_number<Name, T,
96  json_details::number_opts_set<Options, JsonNullDefault>,
97  Constructor>;
98 
108  template<JSONNAMETYPE Name, typename T = double,
110  typename Constructor = default_constructor<T>>
112  Name, T,
113  json_details::number_opts_set<Options, JsonRangeCheck::CheckForNarrowing>,
114  Constructor>;
115 
124  template<JSONNAMETYPE Name, typename T = bool,
126  typename Constructor = default_constructor<T>>
127  struct json_bool;
128 
136  template<JSONNAMETYPE Name, typename T = std::optional<bool>,
137  json_details::json_options_t Options = bool_opts_def,
138  typename Constructor = default_constructor<T>>
141  Constructor>;
142 
155  template<JSONNAMETYPE Name, typename String = std::string,
157  typename Constructor = default_constructor<String>>
158  struct json_string;
159 
172  template<JSONNAMETYPE Name, typename String = std::optional<std::string>,
173  json_details::json_options_t Options = string_opts_def,
174  typename Constructor = nullable_constructor<String>>
176  json_string<Name, String,
177  json_details::string_opts_set<Options, JsonNullDefault>,
178  Constructor>;
179 
195  template<JSONNAMETYPE Name, typename String = std::string,
197  typename Constructor = default_constructor<String>>
198  struct json_string_raw;
199 
214  template<JSONNAMETYPE Name, typename String = std::optional<std::string>,
215  json_details::json_options_t Options = string_raw_opts_def,
216  typename Constructor = nullable_constructor<String>>
218  Name, String, json_details::string_raw_opts_set<Options, JsonNullDefault>,
219  Constructor>;
220 
229  template<JSONNAMETYPE Name, typename T = std::optional<double>,
230  json_details::json_options_t Options = number_opts_def,
231  typename Constructor = nullable_constructor<T>>
233  Name, T,
236  Constructor>;
237 
252  template<JSONNAMETYPE Name, typename Container,
253  typename JsonValueType = typename Container::mapped_type,
254  typename JsonKeyType = json_base::json_string<std::string>,
255  typename Constructor = default_constructor<Container>,
257  struct json_key_value;
258 
272  template<JSONNAMETYPE Name, typename Container,
273  typename JsonValueType = typename Container::mapped_type,
274  typename JsonKeyType = typename Container::key_type,
275  typename Constructor = nullable_constructor<Container>>
277  json_key_value<Name, Container, JsonValueType, JsonKeyType, Constructor,
279 
289  template<JSONNAMETYPE Name,
290  typename T = std::chrono::time_point<std::chrono::system_clock,
291  std::chrono::milliseconds>,
292  typename Constructor =
295  struct json_date;
296 
304  template<JSONNAMETYPE Name,
305  typename T = std::optional<std::chrono::time_point<
306  std::chrono::system_clock, std::chrono::milliseconds>>,
307  typename Constructor =
310 
311  /***
312  * A type to hold the types for parsing tagged variants.
313  * @tparam JsonElements a list of types that can be parsed,
314  */
315  template<typename... JsonElements>
319  fwd_pack<json_details::json_deduced_type<JsonElements>...>;
320  };
321 
333  template<
334  JSONNAMETYPE Name, typename JsonElement,
335  typename Container = std::vector<
337  typename Constructor = default_constructor<Container>,
339  struct json_array;
340 
351  template<
352  JSONNAMETYPE Name, typename JsonElement,
353  typename Container = std::vector<
355  typename Constructor = nullable_constructor<Container>>
358 
374  template<JSONNAMETYPE Name, typename Container,
375  typename JsonValueType = typename Container::mapped_type,
376  typename JsonKeyType = typename Container::key_type,
377  typename Constructor = default_constructor<Container>,
379  struct json_key_value_array;
380 
395  template<JSONNAMETYPE Name, typename Container,
396  typename JsonValueType = typename Container::mapped_type,
397  typename JsonKeyType = typename Container::key_type,
398  typename Constructor = nullable_constructor<Container>>
400  json_key_value_array<Name, Container, JsonValueType, JsonKeyType,
401  Constructor, JsonNullDefault>;
402 
416  template<JSONNAMETYPE Name, typename T,
417  typename FromJsonConverter = default_from_json_converter_t<T>,
418  typename ToJsonConverter = default_to_json_converter_t<T>,
420  struct json_custom;
421 
431  template<JSONNAMETYPE Name, typename T,
432  typename FromJsonConverter = default_from_json_converter_t<T>,
433  typename ToJsonConverter = default_to_json_converter_t<T>,
436  json_custom<Name, T, FromJsonConverter, ToJsonConverter,
437  json_details::json_custom_opts_set<Options, JsonNullDefault>>;
438 
439  template<JSONNAMETYPE Name, typename T,
440  typename FromJsonConverter = default_from_json_converter_t<T>,
441  typename ToJsonConverter = default_to_json_converter_t<T>,
443  using json_custom_lit = json_custom<Name, T, FromJsonConverter, ToJsonConverter,
444  json_details::json_custom_opts_set<Options, JsonCustomTypes::Literal>>;
445 
446  template<JSONNAMETYPE Name, typename T,
447  typename FromJsonConverter = default_from_json_converter_t<T>,
448  typename ToJsonConverter = default_to_json_converter_t<T>,
451  json_custom<Name, T, FromJsonConverter, ToJsonConverter,
453  JsonNullDefault>>;
454 
455  namespace json_details {
456 
457  template<JsonBaseParseTypes PT>
458  constexpr std::size_t
459  find_json_element( std::initializer_list<JsonBaseParseTypes> pts ) {
460  std::size_t idx = 0;
461  for( auto const &pt : pts ) {
462  if( pt == PT ) {
463  return idx;
464  }
465  ++idx;
466  }
467  return daw::numeric_limits<std::size_t>::max( );
468  }
469 
470  template<typename T>
473  };
474 
475  template<typename... Ts>
478  };
479 
480  template<typename... Ts>
481  [[maybe_unused]] constexpr std::conditional_t<
482  std::conjunction<has_json_deduced_type<Ts>...>::value,
485  get_variant_type_list( std::variant<Ts...> const * );
486 
487  template<typename T>
488  using underlying_nullable_type = decltype( *std::declval<T>( ) );
489 
490  template<typename T>
492  std::remove_reference_t<daw::detected_t<underlying_nullable_type, T>>;
493 
494  template<typename T>
495  inline constexpr bool is_nullable_type =
496  daw::is_detected<underlying_nullable_type, T>::value;
497 
498  template<typename T>
499  [[maybe_unused]] constexpr unknown_variant_type<T>
500  get_variant_type_list( T const * );
501 
502  template<JsonNullable, typename>
504 
505  template<JsonNullable Nullable, typename Variant>
506  using determine_variant_element_types = std::conditional_t<
507  not is_nullable_json_value_v<Nullable> or not is_nullable_type<Variant>,
508  std::remove_reference_t<decltype( get_variant_type_list(
509  std::declval<Variant const *>( ) ) )>,
510  std::conditional_t<
511  is_nullable_type<Variant>,
512  std::remove_reference_t<decltype( get_variant_type_list(
513  std::declval<
516  } // namespace json_details
517 
518  /***
519  * Link to a variant like data type. The JSON member can be any one of the
520  * json types. This precludes having more than one class type or array
521  * type(including their specialized keyvalue mappings) or
522  * string-enum/int-enum.
523  * @tparam Name name of JSON member to link to
524  * @tparam T type of value to construct
525  * @tparam JsonElements a json_variant_type_list
526  * @tparam Constructor A callable used to construct T. The
527  * default supports normal and aggregate construction
528  * @tparam Nullable Can the member be missing or have a null value *
529  */
530  template<
531  JSONNAMETYPE Name, typename T,
532  typename JsonElements =
534  typename Constructor = default_constructor<T>,
536  struct json_variant;
537 
538  /***
539  * Link to a nullable JSON variant
540  * @tparam Name name of JSON member to link to
541  * @tparam T type that has specialization of
542  * daw::json::json_data_contract
543  * @tparam JsonElements a json_variant_type_list
544  * @tparam Constructor A callable used to construct T. The
545  * default supports normal and aggregate construction
546  */
547  template<
548  JSONNAMETYPE Name, typename T,
549  typename JsonElements =
551  typename Constructor = nullable_constructor<T>>
554 
555  /***
556  * Link to a variant like data type that is discriminated via another
557  * member.
558  * @tparam Name name of JSON member to link to
559  * @tparam T type of value to construct
560  * @tparam TagMember JSON element to pass to Switcher. Does not have to be
561  * declared in member list
562  * @tparam Switcher A callable that returns an index into JsonElements when
563  * passed the TagMember object in parent member list
564  * @tparam JsonElements a json_tagged_variant_type_list, defaults to type
565  * elements of T when T is a std::variant and they are all auto mappable
566  * @tparam Constructor A callable used to construct T. The
567  * default supports normal and aggregate construction
568  * @tparam Nullable Can the member be missing or have a null value *
569  */
570  template<
571  JSONNAMETYPE Name, typename T, typename TagMember, typename Switcher,
572  typename JsonElements = json_details::determine_variant_element_types<
574  typename Constructor = default_constructor<T>,
576  struct json_tagged_variant;
577 
578  template<
579  JSONNAMETYPE Name, typename JsonElement, typename SizeMember,
580  typename Container = std::vector<
581  typename json_details::json_deduced_type<JsonElement>::parse_to_t>,
582  typename Constructor = default_constructor<Container>,
584  struct json_sized_array;
585 
586  /***
587  * Link to a nullable variant like data type that is discriminated via
588  * another member.
589  * @tparam Name name of JSON member to link to
590  * @tparam T type of value to construct
591  * @tparam TagMember JSON element to pass to Switcher. Does not have to be
592  * declared in member list
593  * @tparam Switcher A callable that returns an index into JsonElements when
594  * passed the TagMember object in parent member list
595  * @tparam JsonElements a json_tagged_variant_type_list, defaults to type
596  * elements of T when T is a std::variant and they are all auto mappable
597  * @tparam Constructor A callable used to construct T. The
598  * default supports normal and aggregate construction
599  */
600  template<
601  JSONNAMETYPE Name, typename T, typename TagMember, typename Switcher,
602  typename JsonElements =
603  json_details::determine_variant_element_types<JsonNullDefault, T>,
604  typename Constructor = nullable_constructor<T>>
606  json_tagged_variant<Name, T, TagMember, Switcher, JsonElements,
607  Constructor, JsonNullDefault>;
608 
609  template<JSONNAMETYPE Name, typename Tuple,
610  typename Constructor = default_constructor<Tuple>,
612  struct json_tuple;
613 
614  template<JSONNAMETYPE Name, typename Tuple,
615  typename Constructor = default_constructor<Tuple>,
617 
619  json_tuple<Name, Tuple, Constructor,
620  json_details::tuple_opts_set<Options, JsonNullDefault>>;
621 
622  namespace json_details {
623  template<typename T>
624  struct ensure_mapped {
625  static_assert( is_a_json_type_v<T>,
626  "The supplied type does not have a json_data_contract" );
627  using type = T;
628  };
629 
630  template<typename T>
632  } // namespace json_details
633  } // namespace DAW_JSON_VER
634 } // namespace daw::json
#define JSONNAMETYPE
Definition: daw_json_name.h:107
typename json_type_deducer< T, has_json_data_contract_trait_v< T >, json_details::is_a_json_type_v< T >, has_json_link_quick_map_v< T >, is_container_v< T > >::type json_deduced_type
Definition: daw_json_parse_common.h:931
std::conditional_t< not is_nullable_json_value_v< Nullable > or not is_nullable_type< Variant >, std::remove_reference_t< decltype(get_variant_type_list(std::declval< Variant const * >()))>, std::conditional_t< is_nullable_type< Variant >, std::remove_reference_t< decltype(get_variant_type_list(std::declval< detected_underlying_nullable_type< Variant > const * >()))>, cannot_deduce_variant_element_types< Nullable, Variant > >> determine_variant_element_types
Definition: daw_json_link_types_fwd.h:515
constexpr bool is_nullable_type
Definition: daw_json_link_types_fwd.h:495
constexpr std::conditional_t< std::conjunction< has_json_deduced_type< Ts >... >::value, json_variant_type_list< json_deduced_type< Ts >... >, missing_default_type_mapping< json_deduced_type< Ts >... > > get_variant_type_list(std::variant< Ts... > const *)
constexpr std::size_t find_json_element(std::initializer_list< JsonBaseParseTypes > pts)
Definition: daw_json_link_types_fwd.h:459
std::uint32_t json_options_t
Definition: daw_json_option_bits.h:23
std::remove_reference_t< daw::detected_t< underlying_nullable_type, T > > detected_underlying_nullable_type
Definition: daw_json_link_types_fwd.h:492
typename ensure_mapped< T >::type ensure_mapped_t
Definition: daw_json_link_types_fwd.h:631
constexpr json_options_t number_opts_set
Definition: daw_json_parse_common.h:317
decltype(*std::declval< T >()) underlying_nullable_type
Definition: daw_json_link_types_fwd.h:488
constexpr json_options_t json_custom_opts_set
Definition: daw_json_parse_common.h:333
constexpr json_details::json_options_t string_opts_def
Definition: daw_json_type_options.h:124
constexpr json_details::json_options_t json_custom_opts_def
Definition: daw_json_type_options.h:213
constexpr json_details::json_options_t tuple_opts_def
Definition: daw_json_type_options.h:179
JsonNullable
Definition: daw_json_enums.h:77
constexpr json_details::json_options_t class_opts_def
Definition: daw_json_type_options.h:168
constexpr json_details::json_options_t bool_opts_def
Definition: daw_json_type_options.h:82
constexpr json_details::json_options_t string_raw_opts_def
Definition: daw_json_type_options.h:156
constexpr JsonNullable JsonNullDefault
Definition: daw_json_enums.h:83
constexpr json_details::json_options_t number_opts_def
Definition: daw_json_type_options.h:69
Definition: daw_from_json.h:22
Definition: daw_json_link_types_iso8601.h:28
Definition: daw_json_traits.h:190
Definition: to_daw_json_string.h:210
Definition: to_daw_json_string.h:131
Definition: daw_json_link_types.h:1242
Definition: daw_json_link_types.h:518
Definition: daw_json_link_types.h:822
Definition: daw_json_link_types.h:1130
Definition: daw_json_link_types.h:750
Definition: daw_json_link_types_fwd.h:624
T type
Definition: daw_json_link_types_fwd.h:627
void i_am_variant_type_list
Definition: daw_json_link_types_fwd.h:477
Definition: daw_json_link_types_fwd.h:471
void i_am_variant_type_list
Definition: daw_json_link_types_fwd.h:472
Definition: daw_json_link_types.h:1566
Definition: daw_json_link_types.h:1453
Definition: daw_json_link_types.h:414
Definition: daw_json_link_types.h:1338
Definition: daw_json_link_types.h:603
Definition: daw_json_link_types.h:685
Definition: daw_json_link_types.h:1035
Definition: daw_json_link_types.h:1643
Definition: daw_json_link_types_fwd.h:316
fwd_pack< json_details::json_deduced_type< JsonElements >... > element_map_t
Definition: daw_json_link_types_fwd.h:319
void i_am_variant_type_list
Definition: daw_json_link_types_fwd.h:317
Definition: daw_json_link_types.h:941
Definition: daw_json_traits.h:331
#define DAW_JSON_VER
Definition: version.h:11