32template <
typename T,
class Value>
33inline T AsExtractor(
const Value& value) {
34 return value.
template As<T>();
37template <
typename T,
class Value>
38inline T ConvertToExtractor(
const Value& value) {
39 return value.
template ConvertTo<T>();
42template <
typename ArrayType,
class Value,
typename ExtractFunc>
43ArrayType ParseArray(
const Value& value, ExtractFunc extract_func) {
44 value.CheckArrayOrNull();
46 auto inserter = std::inserter(response, response.end());
48 for (
const auto& subitem : value) {
49 *inserter = extract_func(subitem);
56template <
typename ObjectType,
class Value,
typename ExtractFunc>
57ObjectType ParseObject(
const Value& value, ExtractFunc extract_func) {
58 using KeyType =
typename ObjectType::key_type;
60 value.CheckObjectOrNull();
63 for (
auto it = value.begin(); it != value.end(); ++it) {
64 if constexpr (std::is_constructible_v<KeyType, std::string>) {
65 result.emplace(it.GetName(), extract_func(*it));
67 result.emplace(Parse(std::string_view(it.GetName()), To<KeyType>{}), extract_func(*it));
76 meta::kIsRange<T> && !meta::kIsMap<T> && !std::is_same_v<T, boost::
uuids::uuid> &&
77 !std::is_convertible_v<T&,
utils::impl::strong_typedef::StrongTypedefTag&>;
81template <impl::RangeNotMap T, common::kIsFormatValue Value>
82T Parse(
const Value& value, To<T>) {
83 return impl::ParseArray<T>(value, &impl::AsExtractor<meta::RangeValueType<T>, Value>);
86template <meta::kIsMap T, common::kIsFormatValue Value>
87T Parse(
const Value& value, To<T>) {
88 return impl::ParseObject<T>(value, &impl::AsExtractor<
typename T::mapped_type, Value>);
91template <
typename T,
typename Value>
92std::optional<
decltype(Parse(std::declval<Value>(), To<T>{}))> Parse(
const Value& value, To<std::optional<T>>) {
93 if (value.IsMissing() || value.IsNull()) {
96 return value.
template As<T>();
100std::optional<std::nullptr_t> Parse(
const Value&, To<std::optional<std::nullptr_t>>) {
101 static_assert(!
sizeof(Value),
"optional<nullptr_t> is forbidden, check IsNull() instead");
105template <impl::RangeNotMap T,
typename Value>
106T Convert(
const Value& value, To<T>) {
107 if (value.IsMissing()) {
110 return impl::ParseArray<T>(value, &impl::ConvertToExtractor<meta::RangeValueType<T>, Value>);
113template <meta::kIsMap T,
typename Value>
114T Convert(
const Value& value, To<T>) {
115 if (value.IsMissing()) {
118 return impl::ParseObject<T>(value, &impl::ConvertToExtractor<
typename T::mapped_type, Value>);
121template <
typename T,
typename Value>
122std::optional<T> Convert(
const Value& value, To<std::optional<T>>) {
123 if (value.IsMissing() || value.IsNull()) {
126 return value.
template ConvertTo<T>();
129template <
class Value>
130std::optional<std::nullptr_t> Convert(
const Value&, To<std::optional<std::nullptr_t>>) {
131 static_assert(!
sizeof(Value),
"optional<nullptr_t> is forbidden, check IsNull() instead");