42 template<
typename S,
typename T>
43 struct AllSerializable {
44 constexpr static auto value =
false;
47 template<
typename S,
typename... Types>
48 struct AllSerializable<S, meta::List<Types...>> {
49 constexpr static auto value = (concepts::Serializable<Types, S> && ...);
52 template<
typename S, concepts::TypeList T>
53 constexpr static auto all_serializable = AllSerializable<S, T>::value;
62 config.m_pretty =
true;
68 config.m_indent_width = width;
72 constexpr auto is_pretty() const ->
bool {
return m_pretty; }
73 constexpr auto indent_width() const ->
int {
return m_indent_width; }
76 bool m_pretty {
false };
77 int m_indent_width { 4 };
80template<concepts::Impl<Writer> Writer>
89 class ObjectSerializerProxy {
94 DI_TRY(m_serializer.get().serialize_key(key));
96 return m_serializer.get().serialize_bool(value);
100 DI_TRY(m_serializer.get().serialize_key(key));
102 return m_serializer.get().serialize_null();
107 DI_TRY(m_serializer.get().serialize_key(key));
109 return m_serializer.get().serialize_string(view);
114 DI_TRY(m_serializer.get().serialize_key(key));
116 return m_serializer.get().serialize_number(number);
119 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, JsonSerializer&> F>
121 DI_TRY(m_serializer.get().serialize_key(key));
123 return m_serializer.get().serialize_array(util::forward<F>(
function));
126 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, ObjectSerializerProxy&> F>
128 DI_TRY(m_serializer.get().serialize_key(key));
130 return m_serializer.get().serialize_object(util::forward<F>(
function));
133 template<concepts::Serializable<JsonSerializer> T>
135 DI_TRY(m_serializer.get().serialize_key(key));
144 constexpr static auto to_hex_digit(
u8 value) ->
c8 {
147 return value +
c8(
'0');
149 return (value - 10) +
c8(
'A');
158 : m_writer(
util::forward<T>(
writer)), m_config(config) {}
161 DI_TRY(serialize_comma());
169 return serialize_true();
171 return serialize_false();
175 DI_TRY(serialize_comma());
178 for (
auto code_point_view : slide(view, 1)) {
179 auto code_point = *
front(code_point_view);
181 if (code_point == U
'"' || code_point == U
'\\' || code_point <= 0x1Fu) {
182 switch (code_point) {
206 text[4] = to_hex_digit((code_point >> 4) & 0xF);
207 text[5] = to_hex_digit(code_point & 0xF);
219 DI_TRY(serialize_comma());
223 auto context = TargetContext {};
232 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, JsonSerializer&> F>
234 DI_TRY(serialize_array_begin());
237 return serialize_array_end();
240 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, ObjectSerializerProxy&> F>
242 DI_TRY(serialize_object_begin());
244 auto proxy = ObjectSerializerProxy(*
this);
246 return serialize_object_end();
249 template<
typename T, concepts::InstanceOf<reflection::Fields> M>
258 if (!
field.get(value).has_value()) {
270 template<
typename T, concepts::InstanceOf<reflection::Enumerators> M>
275 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
276 requires(M::is_bool() || M::is_string() || M::is_integer())
278 if constexpr (M::is_bool()) {
280 }
else if constexpr (M::is_string()) {
282 }
else if constexpr (M::is_integer()) {
287 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
289 requires(M::is_custom_atom() &&
requires {
di::to_string(value); })
295 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
296 requires(M::is_tuple() && detail::all_serializable<JsonSerializer, meta::TupleElements<T>>)
307 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
308 requires(M::is_variant() && detail::all_serializable<JsonSerializer, meta::VariantTypes<T>>)
320 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
329 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
339 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
340 requires(M::is_map() && concepts::detail::ConstantString<meta::TupleElement<meta::ContainerValue<T>, 0>> &&
353 constexpr auto writer() && ->
Writer&& {
return util::move(*this).m_writer; }
357 DI_TRY(serialize_comma());
364 DI_TRY(serialize_comma());
371 if (m_state == State::Value) {
376 DI_TRY(serialize_newline());
377 DI_TRY(serialize_indent());
378 }
else if (m_indent > 0) {
379 DI_TRY(serialize_newline());
380 DI_TRY(serialize_indent());
386 DI_TRY(serialize_comma());
394 if (m_state != State::First) {
395 DI_TRY(serialize_newline());
396 DI_TRY(serialize_indent());
403 DI_TRY(serialize_comma());
411 if (m_state != State::First) {
412 DI_TRY(serialize_newline());
413 DI_TRY(serialize_indent());
422 if (pretty_print()) {
429 if (!pretty_print()) {
436 if (!pretty_print()) {
444 constexpr auto pretty_print() const ->
bool {
return m_config.is_pretty(); }
447 JsonSerializerConfig m_config;
448 usize m_indent { 0 };
449 State m_state { State::First };
458template<concepts::Impl<io::Reader> Reader>
462 template<concepts::Impl<io::Writer> Writer,
typename... Args>
468 template<concepts::Impl<io::Reader> Reader,
typename... Args>
478 struct ToJsonStringFunction {
479 template<concepts::Serializable<JsonSerializer<io::StringWriter<>>> T,
typename... Args>
481 constexpr auto operator()(T&& value, Args&&... args)
const {
490 struct SerializeJsonFunction {
491 template<concepts::Impl<io::Writer> Writer, concepts::Serializable<JsonSerializer<Writer>> T,
typename... Args>
494 constexpr auto operator()(
Writer&& writer, T&& value, Args&&... args)
const {
504using serialization::JsonFormat;
506using serialization::JsonSerializerConfig;
#define DI_ASSERT(...)
Definition assert_bool.h:7
JsonSerializerConfig()=default
constexpr auto serialize_array(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:233
constexpr auto serialize_number(concepts::Integral auto number) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:218
constexpr JsonSerializer(T &&writer, JsonSerializerConfig config={})
Definition json_serializer.h:157
constexpr auto serialize_bool(bool value) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:167
constexpr auto serialize_object(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:241
Definition string_view_impl.h:19
Definition utf8_encoding.h:107
Definition bounded_format_context.h:9
Definition string_writer.h:14
A deserializer for the JSON format.
Definition json_deserializer.h:56
Definition json_serializer.h:56
constexpr auto pretty() const -> JsonSerializerConfig
Definition json_serializer.h:60
constexpr auto indent_width(int width) const -> JsonSerializerConfig
Definition json_serializer.h:66
JsonSerializerConfig()=default
constexpr auto is_pretty() const -> bool
Definition json_serializer.h:72
constexpr auto indent_width() const -> int
Definition json_serializer.h:73
Definition json_serializer.h:81
constexpr auto serialize_array(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:233
constexpr auto writer() &-> Writer &
Definition json_serializer.h:351
constexpr auto serialize(T value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:271
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:250
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:343
constexpr auto writer() &&-> Writer &&
Definition json_serializer.h:353
JsonFormat SerializationFormat
Definition json_serializer.h:153
constexpr auto serialize_null() -> meta::WriterResult< void, Writer >
Definition json_serializer.h:160
constexpr auto serialize_number(concepts::Integral auto number) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:218
constexpr auto serialize_string(container::StringView view) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:174
constexpr JsonSerializer(T &&writer, JsonSerializerConfig config={})
Definition json_serializer.h:157
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:309
return serialize_string(string.view())
constexpr auto serialize_bool(bool value) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:167
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:331
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer > requires(M::is_custom_atom() &&
Definition json_serializer.h:288
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:322
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:277
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:297
constexpr auto serialize_object(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:241
constexpr auto writer() const &-> Writer const &
Definition json_serializer.h:352
Definition reference_wrapper.h:14
Definition operations.h:11
Definition language.h:224
Definition serialize.h:175
Definition tuple_like.h:38
#define DI_TRY(...)
Definition monad_try.h:13
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
constexpr auto sequence
Definition sequence.h:34
constexpr auto fixed_string_to_utf8_string_view
Definition fixed_string_to_utf8_string_view.h:32
constexpr auto invoke
Definition invoke.h:100
constexpr auto write_exactly
Definition write_exactly.h:51
meta::List< ReadSome > Reader
Definition reader.h:34
meta::List< WriteSome, Flush, InteractiveDevice > Writer
Definition writer.h:85
constexpr auto enum_to_string
Definition enum_to_string.h:72
JsonSerializer(T &&) -> JsonSerializer< T >
constexpr auto serialize_string
Definition serialize_string.h:23
constexpr auto serialize
Definition serialize.h:130
constexpr auto json_format
Definition json_serializer.h:475
constexpr auto serialize_json
Definition json_serializer.h:500
constexpr auto to_json_string
Definition json_serializer.h:487
constexpr auto serializer
Definition serialize.h:43
size_t usize
Definition integers.h:33
char8_t c8
Definition char.h:4
__UINT8_TYPE__ u8
Definition integers.h:9
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto ref
Definition reference_wrapper.h:98
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
ScopeValueChange(T &, T) -> ScopeValueChange< T >
constexpr auto tuple_sequence
Definition tuple_sequence.h:36
Definition any_storable.h:9
constexpr auto front
Definition access.h:58
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr auto field
Definition field.h:46
constexpr auto tuple_sequence
Definition tuple_sequence.h:36
constexpr auto json_format
Definition json_serializer.h:475
constexpr auto to_string
Definition to_string.h:14
constexpr auto serializer
Definition serialize.h:43