36 template<
typename S,
typename T>
37 struct AllDeserializable {
38 constexpr static auto value =
false;
41 template<
typename S,
typename... Types>
42 struct AllDeserializable<S, meta::List<Types...>> {
43 constexpr static auto value = (concepts::Deserializable<Types, S> && ...);
46 template<
typename S, concepts::TypeList T>
47 constexpr static auto all_deserializable = AllDeserializable<S, T>::value;
55template<concepts::Impl<io::Reader> Reader>
58 template<
typename T =
void>
74 template<
typename T, concepts::InstanceOf<reflection::Fields> M>
85 auto code_point =
DI_TRY(peek_next_code_point());
89 if (*code_point == U
'}') {
95 auto key =
DI_TRY(deserialize_string());
102 [&](
auto field) -> Result<void> {
121 DI_TRY(skip_whitespace());
125 template<
typename T, concepts::InstanceOf<reflection::Enumerators> M>
127 DI_TRY(skip_whitespace());
128 auto string =
DI_TRY(deserialize_string());
129 DI_TRY(skip_whitespace());
148 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
149 requires(M::is_bool() || M::is_integer() || M::is_string())
151 if constexpr (M::is_bool()) {
153 DI_TRY(skip_whitespace());
155 }
else if constexpr (M::is_integer()) {
157 DI_TRY(skip_whitespace());
159 }
else if constexpr (M::is_string()) {
161 DI_TRY(skip_whitespace());
166 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
175 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
176 requires(M::is_tuple() && detail::all_deserializable<JsonDeserializer, meta::TupleElements<T>>)
181 DI_TRY(skip_whitespace());
186 [&]<
typename Value>(Value& value) -> Result<> {
187 DI_TRY(skip_whitespace());
188 auto code_point =
DI_TRY(peek_next_code_point());
193 if (*code_point == U
']') {
205 DI_TRY(skip_whitespace());
207 DI_TRY(skip_whitespace());
211 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
212 requires(M::is_variant() && detail::all_deserializable<JsonDeserializer, meta::VariantTypes<T>>)
214 constexpr auto possible_keys = []<
typename... Types>(
meta::List<Types...>) {
218 DI_TRY(skip_whitespace());
221 auto key =
DI_TRY(deserialize_string());
222 DI_TRY(skip_whitespace());
224 DI_TRY(skip_whitespace());
226 auto it =
di::find(possible_keys, key);
227 if (it == possible_keys.end()) {
233 using Value = meta::At<meta::VariantTypes<T>, index>;
234 return serialization::deserialize<Value>(*this);
237 DI_TRY(skip_whitespace());
239 DI_TRY(skip_whitespace());
243 template<
typename T, concepts::InstanceOf<reflection::Atom> M,
typename U = meta::Type<meta::RemoveCVRef<T>>>
246 DI_TRY(skip_whitespace());
249 auto code_point =
DI_TRY(peek_next_code_point());
250 if (code_point == U
'n') {
251 DI_TRY(deserialize_null());
257 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
262 DI_TRY(skip_whitespace());
266 DI_TRY(skip_whitespace());
267 auto code_point =
DI_TRY(peek_next_code_point());
271 if (*code_point == U
']') {
281 DI_TRY(skip_whitespace());
285 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
291 DI_TRY(skip_whitespace());
295 DI_TRY(skip_whitespace());
296 auto code_point =
DI_TRY(peek_next_code_point());
300 if (*code_point == U
'}') {
306 auto key =
DI_TRY(deserialize_string());
307 DI_TRY(skip_whitespace());
309 DI_TRY(skip_whitespace());
311 result.insert_or_assign(util::move(key), util::move(value));
315 DI_TRY(skip_whitespace());
321 DI_TRY(skip_whitespace());
327 constexpr auto reader() && ->
Reader&& {
return util::move(*this).m_reader; }
330 constexpr static auto is_whitespace(
c32 code_point) ->
bool {
331 return code_point ==
' ' || code_point ==
'\t' || code_point ==
'\n' || code_point ==
'\r';
335 auto code_point =
DI_TRY(next_code_point());
336 if (!code_point || *code_point != expected) {
342 constexpr auto fill_next_code_point() -> Result<void> {
349 m_next_code_point =
c32(
byte[0]);
353 constexpr auto peek_next_code_point() -> Result<vocab::Optional<c32>> {
357 if (!m_next_code_point) {
358 DI_TRY(fill_next_code_point());
363 return *m_next_code_point;
368 constexpr auto next_code_point() -> Result<vocab::Optional<c32>> {
372 if (!m_next_code_point) {
373 DI_TRY(fill_next_code_point());
381 constexpr auto require_next_code_point() -> Result<c32> {
389 constexpr auto skip_whitespace() -> Result<void> {
392 if (!code_point || !is_whitespace(*code_point)) {
399 constexpr auto deserialize_value() -> Result<json::Value> {
400 DI_TRY(skip_whitespace());
407 switch (*code_point) {
409 return deserialize_null();
411 return deserialize_true();
413 return deserialize_false();
415 return deserialize_string();
429 return deserialize_object();
431 return deserialize_array();
437 constexpr auto deserialize_null() -> Result<json::Null> {
438 DI_TRY(skip_whitespace());
447 constexpr auto deserialize_bool() -> Result<json::Bool> {
448 DI_TRY(skip_whitespace());
451 switch (code_point) {
468 constexpr auto deserialize_true() -> Result<json::Bool> {
469 DI_TRY(skip_whitespace());
477 constexpr auto deserialize_false() -> Result<json::Bool> {
478 DI_TRY(skip_whitespace());
487 constexpr auto from_hex_digit(
c32 code_point) -> Result<u16> {
488 if ((
'0'_m -
'9'_m)(code_point)) {
489 return u16(code_point -
'0');
491 if ((
'A'_m -
'F'_m)(code_point)) {
492 return u16(10u + (code_point -
'A'));
494 if ((
'a'_m -
'f'_m)(code_point)) {
495 return u16(10u + (code_point -
'a'));
500 constexpr auto parse_four_hex_digits() -> Result<u16> {
509 constexpr static auto is_high_surrogate(
u16 code_unit) ->
bool {
return (code_unit >> 10) == 0b110110u; }
510 constexpr static auto is_low_surrogate(
u16 code_unit) ->
bool {
return (code_unit >> 10) == 0b110111u; }
512 constexpr auto deserialize_string() -> Result<json::String> {
513 DI_TRY(skip_whitespace());
519 if (!code_point || *code_point < 0x20) {
522 if (code_point == U
'\\') {
523 auto escaped =
DI_TRY(require_next_code_point());
526 string.push_back(U
'"');
529 string.push_back(U
'\\');
532 string.push_back(U
'/');
535 string.push_back(U
'\b');
538 string.push_back(U
'\f');
541 string.push_back(U
'\n');
544 string.push_back(U
'\r');
547 string.push_back(U
'\t');
553 if (is_high_surrogate(code_point)) {
557 auto low_code_point =
DI_TRY(parse_four_hex_digits());
558 if (!is_low_surrogate(low_code_point)) {
561 auto actual_code_point =
562 c32((code_point - 0xD800u) << 10) +
c32(low_code_point - 0xDC00u) +
c32(0x10000);
563 string.push_back(actual_code_point);
566 if (is_low_surrogate(code_point)) {
569 string.push_back(
c32(code_point));
577 if (*code_point == U
'"') {
580 string.push_back(*code_point);
585 template<concepts::Integer T>
586 constexpr auto deserialize_number(InPlaceType<T>) -> Result<json::Number> {
587 DI_TRY(skip_whitespace());
588 auto first_code_point =
DI_TRY(require_next_code_point());
591 if (first_code_point == U
'-') {
592 string.push_back(first_code_point);
593 first_code_point =
DI_TRY(require_next_code_point());
594 if (first_code_point < U
'0' || first_code_point > U
'9') {
598 if (first_code_point == U
'0') {
610 if (*code_point < U
'0' || *code_point > U
'9') {
614 string.push_back(*code_point);
626 constexpr auto deserialize_array() -> Result<json::Array> {
627 DI_TRY(skip_whitespace());
632 DI_TRY(skip_whitespace());
637 if (*code_point == U
']') {
640 if (!array.empty()) {
643 array.push_back(
DI_TRY(deserialize_value()));
650 constexpr auto deserialize_object() -> Result<json::Object> {
651 DI_TRY(skip_whitespace());
656 DI_TRY(skip_whitespace());
661 if (*code_point == U
'}') {
664 if (!
object.
empty()) {
666 DI_TRY(skip_whitespace());
668 auto key =
DI_TRY(deserialize_string());
669 DI_TRY(skip_whitespace());
672 object.insert_or_assign(util::move(key), util::move(value));
680 vocab::Optional<c32> m_next_code_point;
681 bool m_at_end {
false };
689 struct FromJsonStringFunction {
690 template<
typename... Args>
699template<concepts::Deserializable<JsonDeserializer<StringReader<container::StringView>>> T = json::Value>
704 struct DeserializeJsonFunction {
705 template<concepts::Impl<io::Reader> Reader,
typename... Args>
709 constexpr auto operator()(
Reader&& reader, Args&&... args)
const {
715template<
typename T = json::Value>
720inline namespace literals {
723 template<container::FixedString
string>
724 consteval auto valid_json_literal() ->
bool {
734 template<container::FixedString
string>
735 requires(detail::valid_json_literal<string>())
736 constexpr auto operator""_json() {
744#if !defined(DI_NO_GLOBALS) && !defined(DI_NO_GLOBAL_JSON_LITERALS)
constexpr JsonDeserializer(T &&reader)
Definition json_deserializer.h:66
constexpr auto push_back(CodePoint code_point)
Definition mutable_string_interface.h:147
Definition string_reader.h:18
A deserializer for the JSON format.
Definition json_deserializer.h:56
constexpr auto reader() &-> Reader &
Definition json_deserializer.h:325
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:150
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:213
constexpr auto deserialize(InPlaceType< T >, M fields) -> Result< T >
Definition json_deserializer.h:75
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:259
constexpr auto deserialize(InPlaceType< T >, M enumerators) -> Result< T >
Definition json_deserializer.h:126
constexpr JsonDeserializer(T &&reader)
Definition json_deserializer.h:66
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T > requires(M::is_custom_atom() &&
Definition json_deserializer.h:167
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:245
JsonFormat DeserializationFormat
Definition json_deserializer.h:62
auto result
Definition json_deserializer.h:171
constexpr auto reader() &&-> Reader &&
Definition json_deserializer.h:327
constexpr auto reader() const &-> Reader const &
Definition json_deserializer.h:326
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:177
constexpr auto deserialize(InPlaceType< json::Null >) -> Result< json::Null >
Definition json_deserializer.h:319
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:288
constexpr auto deserialize(InPlaceType< json::Value >) -> Result< json::Value >
Definition json_deserializer.h:68
Definition unexpected.h:14
Definition operations.h:11
Definition deserialize.h:153
#define DI_TRY(...)
Definition monad_try.h:13
#define TRY
Definition monad_try.h:23
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
constexpr auto fixed_string_to_utf8_string_view
Definition fixed_string_to_utf8_string_view.h:32
constexpr auto value
Definition value.h:34
constexpr auto index_dispatch
Definition index_dispatch.h:41
constexpr auto read_some
Definition reader.h:32
meta::List< ReadSome > Reader
Definition reader.h:34
Definition json_deserializer.h:721
constexpr auto code_point
Definition code_point_parser.h:35
constexpr auto parse
Definition parse.h:23
constexpr auto null
Definition json_value.h:51
container::String String
Definition json_value.h:58
container::TreeMap< container::String, Value > Object
Definition json_value.h:60
container::Vector< Value > Array
Definition json_value.h:59
constexpr auto from_json_string
Definition json_deserializer.h:700
JsonDeserializer(T &&) -> JsonDeserializer< T >
constexpr auto deserialize_json
Definition json_deserializer.h:716
constexpr auto json_format
Definition json_serializer.h:475
constexpr auto deserialize_string
Definition deserialize_string.h:27
constexpr auto deserialize
Definition deserialize.h:178
size_t usize
Definition integers.h:33
char32_t c32
Definition char.h:6
__UINT16_TYPE__ u16
Definition integers.h:10
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
Array(T, U...) -> Array< T, 1+sizeof...(U)>
Expected< T, Error > Result
Definition result.h:8
constexpr auto nullopt
Definition nullopt.h:15
constexpr auto tuple_sequence
Definition tuple_sequence.h:36
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
Definition any_storable.h:9
constexpr auto empty
Definition empty.h:45
constexpr auto make_box
Definition box.h:169
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto find
Definition find.h:35
constexpr auto enumerator
Definition enumerator.h:40
constexpr auto field
Definition field.h:46
constexpr auto json_format
Definition json_serializer.h:475
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto deserialize
Definition deserialize.h:178
constexpr auto parse
Definition parse.h:23
Definition in_place_type.h:5