31template <
typename T,
class Value>
32inline T AsExtractor(
const Value& value) {
33 return value.
template As<T>();
36template <
typename T,
class Value>
37inline T ConvertToExtractor(
const Value& value) {
38 return value.
template ConvertTo<T>();
41template <
typename ArrayType,
class Value,
typename ExtractFunc>
42ArrayType ParseArray(
const Value& value, ExtractFunc extract_func) {
43 value.CheckArrayOrNull();
45 auto inserter = std::inserter(response, response.end());
47 for (
const auto& subitem : value) {
48 *inserter = extract_func(subitem);
55template <
typename ObjectType,
class Value,
typename ExtractFunc>
56ObjectType ParseObject(
const Value& value, ExtractFunc extract_func) {
57 using KeyType =
typename ObjectType::key_type;
59 value.CheckObjectOrNull();
62 for (
auto it = value.begin(); it != value.end(); ++it) {
63 if constexpr (std::is_constructible_v<KeyType, std::string>) {
64 result.emplace(it.GetName(), extract_func(*it));
66 result.emplace(Parse(std::string_view(it.GetName()), To<KeyType>{}), extract_func(*it));
75 meta::kIsRange<T> && !meta::kIsMap<T> && !std::is_same_v<T, boost::uuids::uuid> &&
76 !std::is_convertible_v<T&,
utils::impl::strong_typedef::StrongTypedefTag&>;
80template <impl::RangeNotMap T, common::kIsFormatValue Value>
81T Parse(
const Value& value, To<T>) {
82 return impl::ParseArray<T>(value, &impl::AsExtractor<meta::RangeValueType<T>, Value>);
85template <meta::kIsMap T, common::kIsFormatValue Value>
86T Parse(
const Value& value, To<T>) {
87 return impl::ParseObject<T>(value, &impl::AsExtractor<
typename T::mapped_type, Value>);
90template <
typename T,
typename Value>
91std::optional<
decltype(Parse(std::declval<Value>(), To<T>{}))> Parse(
const Value& value, To<std::optional<T>>) {
92 if (value.IsMissing() || value.IsNull()) {
95 return value.
template As<T>();
99std::optional<std::nullptr_t> Parse(
const Value&, To<std::optional<std::nullptr_t>>) {
100 static_assert(!
sizeof(Value),
"optional<nullptr_t> is forbidden, check IsNull() instead");
104template <impl::RangeNotMap T,
typename Value>
105T Convert(
const Value& value, To<T>) {
106 if (value.IsMissing()) {
109 return impl::ParseArray<T>(value, &impl::ConvertToExtractor<meta::RangeValueType<T>, Value>);
112template <meta::kIsMap T,
typename Value>
113T Convert(
const Value& value, To<T>) {
114 if (value.IsMissing()) {
117 return impl::ParseObject<T>(value, &impl::ConvertToExtractor<
typename T::mapped_type, Value>);
120template <
typename T,
typename Value>
121std::optional<T> Convert(
const Value& value, To<std::optional<T>>) {
122 if (value.IsMissing() || value.IsNull()) {
125 return value.
template ConvertTo<T>();
128template <
class Value>
129std::optional<std::nullptr_t> Convert(
const Value&, To<std::optional<std::nullptr_t>>) {
130 static_assert(!
sizeof(Value),
"optional<nullptr_t> is forbidden, check IsNull() instead");