35template<concepts::Impl<io::Reader> Reader>
49 auto result =
DI_TRY(deserialize_value());
54 template<
typename T, concepts::InstanceOf<reflection::Fields> M>
65 auto code_point =
DI_TRY(peek_next_code_point());
69 if (*code_point == U
'}') {
75 auto key =
DI_TRY(deserialize_string());
82 [&](
auto field) -> Result<void> {
101 DI_TRY(skip_whitespace());
105 template<
typename T, concepts::InstanceOf<reflection::Enumerators> M>
107 DI_TRY(skip_whitespace());
108 auto string =
DI_TRY(deserialize_string());
109 DI_TRY(skip_whitespace());
128 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
129 requires(M::is_bool() || M::is_integer() || M::is_string())
131 if constexpr (M::is_bool()) {
132 auto result =
DI_TRY(deserialize_bool());
133 DI_TRY(skip_whitespace());
135 }
else if constexpr (M::is_integer()) {
137 DI_TRY(skip_whitespace());
139 }
else if constexpr (M::is_string()) {
140 auto result =
DI_TRY(deserialize_string());
141 DI_TRY(skip_whitespace());
146 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
151 DI_TRY(skip_whitespace());
155 DI_TRY(skip_whitespace());
156 auto code_point =
DI_TRY(peek_next_code_point());
160 if (*code_point == U
']') {
163 if (!result.empty()) {
170 DI_TRY(skip_whitespace());
174 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
180 DI_TRY(skip_whitespace());
184 DI_TRY(skip_whitespace());
185 auto code_point =
DI_TRY(peek_next_code_point());
189 if (*code_point == U
'}') {
192 if (!result.empty()) {
195 auto key =
DI_TRY(deserialize_string());
196 DI_TRY(skip_whitespace());
198 DI_TRY(skip_whitespace());
200 result.insert_or_assign(util::move(key), util::move(value));
204 DI_TRY(skip_whitespace());
209 auto result =
DI_TRY(deserialize_null());
210 DI_TRY(skip_whitespace());
216 constexpr auto reader() && ->
Reader&& {
return util::move(*this).m_reader; }
219 constexpr static auto is_whitespace(
c32 code_point) ->
bool {
220 return code_point ==
' ' || code_point ==
'\t' || code_point ==
'\n' || code_point ==
'\r';
224 auto code_point =
DI_TRY(next_code_point());
225 if (!code_point || *code_point != expected) {
231 constexpr auto fill_next_code_point() -> Result<void> {
238 m_next_code_point =
c32(
byte[0]);
242 constexpr auto peek_next_code_point() -> Result<vocab::Optional<c32>> {
246 if (!m_next_code_point) {
247 DI_TRY(fill_next_code_point());
252 return *m_next_code_point;
257 constexpr auto next_code_point() -> Result<vocab::Optional<c32>> {
261 if (!m_next_code_point) {
262 DI_TRY(fill_next_code_point());
270 constexpr auto require_next_code_point() -> Result<c32> {
278 constexpr auto skip_whitespace() -> Result<void> {
281 if (!code_point || !is_whitespace(*code_point)) {
288 constexpr auto deserialize_value() -> Result<json::Value> {
289 DI_TRY(skip_whitespace());
296 switch (*code_point) {
298 return deserialize_null();
300 return deserialize_true();
302 return deserialize_false();
304 return deserialize_string();
318 return deserialize_object();
320 return deserialize_array();
326 constexpr auto deserialize_null() -> Result<json::Null> {
327 DI_TRY(skip_whitespace());
336 constexpr auto deserialize_bool() -> Result<json::Bool> {
337 DI_TRY(skip_whitespace());
340 switch (code_point) {
357 constexpr auto deserialize_true() -> Result<json::Bool> {
358 DI_TRY(skip_whitespace());
366 constexpr auto deserialize_false() -> Result<json::Bool> {
367 DI_TRY(skip_whitespace());
376 constexpr auto deserialize_string() -> Result<json::String> {
377 DI_TRY(skip_whitespace());
383 if (!code_point || *code_point < 0x20) {
386 if (*code_point == U
'"') {
390 string.push_back(*code_point);
395 template<concepts::Integer T>
396 constexpr auto deserialize_number(InPlaceType<T>) -> Result<json::Number> {
397 DI_TRY(skip_whitespace());
398 auto first_code_point =
DI_TRY(require_next_code_point());
401 if (first_code_point == U
'-') {
402 string.push_back(first_code_point);
403 first_code_point =
DI_TRY(require_next_code_point());
404 if (first_code_point < U
'0' || first_code_point > U
'9') {
408 if (first_code_point == U
'0') {
412 string.push_back(first_code_point);
420 if (*code_point < U
'0' || *code_point > U
'9') {
424 string.push_back(*code_point);
436 constexpr auto deserialize_array() -> Result<json::Array> {
437 DI_TRY(skip_whitespace());
442 DI_TRY(skip_whitespace());
447 if (*code_point == U
']') {
450 if (!array.empty()) {
453 array.push_back(
DI_TRY(deserialize_value()));
460 constexpr auto deserialize_object() -> Result<json::Object> {
461 DI_TRY(skip_whitespace());
466 DI_TRY(skip_whitespace());
471 if (*code_point == U
'}') {
474 if (!
object.
empty()) {
476 DI_TRY(skip_whitespace());
478 auto key =
DI_TRY(deserialize_string());
479 DI_TRY(skip_whitespace());
482 object.insert_or_assign(util::move(key), util::move(value));
490 vocab::Optional<c32> m_next_code_point;
491 bool m_at_end {
false };
500 template<
typename... Args>
509template<concepts::Deserializable<JsonDeserializer<StringReader<container::StringView>>> T = json::Value>
515 template<concepts::Impl<io::Reader> Reader,
typename... Args>
519 constexpr auto operator()(
Reader&& reader, Args&&... args)
const {
519 constexpr auto operator()(
Reader&& reader, Args&&... args)
const {
…}
525template<
typename T = json::Value>
530inline namespace literals {
533 template<container::FixedString
string>
544 template<container::FixedString
string>
546 constexpr auto operator""_json() {
546 constexpr auto operator""_json() {
…}
554#if !defined(DI_NO_GLOBALS) && !defined(DI_NO_GLOBAL_JSON_LITERALS)
Definition string_reader.h:18
A deserializer for the JSON format.
Definition json_serializer.h:355
constexpr auto reader() &-> Reader &
Definition json_deserializer.h:214
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:130
constexpr auto deserialize(InPlaceType< T >, M fields) -> Result< T >
Definition json_deserializer.h:55
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:148
constexpr auto deserialize(InPlaceType< T >, M enumerators) -> Result< T >
Definition json_deserializer.h:106
constexpr JsonDeserializer(T &&reader)
Definition json_deserializer.h:46
JsonFormat DeserializationFormat
Definition json_deserializer.h:42
constexpr auto reader() &&-> Reader &&
Definition json_deserializer.h:216
constexpr auto reader() const &-> Reader const &
Definition json_deserializer.h:215
constexpr auto deserialize(InPlaceType< json::Null >) -> Result< json::Null >
Definition json_deserializer.h:208
constexpr auto deserialize(InPlaceType< T >, M) -> Result< T >
Definition json_deserializer.h:177
constexpr auto deserialize(InPlaceType< json::Value >) -> Result< json::Value >
Definition json_deserializer.h:48
Definition operations.h:11
Definition deserialize.h:153
#define DI_TRY(...)
Definition monad_try.h:13
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 read_some
Definition reader.h:32
meta::List< ReadSome > Reader
Definition reader.h:34
Definition json_deserializer.h:532
consteval auto valid_json_literal() -> bool
Definition json_deserializer.h:534
Definition json_deserializer.h:531
constexpr auto code_point
Definition code_point_parser.h:35
constexpr auto parse
Definition parse.h:23
Definition binary_deserializer.h:137
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
Definition binary_deserializer.h:33
constexpr auto from_json_string
Definition json_deserializer.h:510
JsonDeserializer(T &&) -> JsonDeserializer< T >
constexpr auto deserialize_json
Definition json_deserializer.h:526
constexpr auto json_format
Definition json_serializer.h:371
constexpr auto deserialize_string
Definition deserialize_string.h:27
constexpr auto deserialize
Definition deserialize.h:178
char32_t c32
Definition char.h:6
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 zstring_parser.h:9
constexpr auto empty
Definition empty.h:45
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto enumerator
Definition enumerator.h:36
constexpr auto field
Definition field.h:42
constexpr auto in_place_type
Definition in_place_type.h:12
Definition json_deserializer.h:514
Definition json_deserializer.h:499
Definition in_place_type.h:5