42 config.m_pretty =
true;
48 config.m_indent_width =
width;
52 constexpr auto is_pretty() const ->
bool {
return m_pretty; }
53 constexpr auto indent_width() const ->
int {
return m_indent_width; }
56 bool m_pretty {
false };
57 int m_indent_width { 4 };
60template<concepts::Impl<Writer> Writer>
69 class ObjectSerializerProxy {
74 DI_TRY(m_serializer.get().serialize_key(key));
76 return m_serializer.get().serialize_bool(value);
80 DI_TRY(m_serializer.get().serialize_key(key));
82 return m_serializer.get().serialize_null();
87 DI_TRY(m_serializer.get().serialize_key(key));
89 return m_serializer.get().serialize_string(view);
94 DI_TRY(m_serializer.get().serialize_key(key));
96 return m_serializer.get().serialize_number(number);
99 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, JsonSerializer&> F>
101 DI_TRY(m_serializer.get().serialize_key(key));
103 return m_serializer.get().serialize_array(util::forward<F>(
function));
106 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, ObjectSerializerProxy&> F>
108 DI_TRY(m_serializer.get().serialize_key(key));
110 return m_serializer.get().serialize_object(util::forward<F>(
function));
113 template<concepts::Serializable<JsonSerializer> T>
115 DI_TRY(m_serializer.get().serialize_key(key));
130 : m_writer(
util::forward<T>(
writer)), m_config(config) {}
133 DI_TRY(serialize_comma());
141 return serialize_true();
143 return serialize_false();
147 DI_TRY(serialize_comma());
157 DI_TRY(serialize_comma());
161 auto context = TargetContext {};
170 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, JsonSerializer&> F>
172 DI_TRY(serialize_array_begin());
175 return serialize_array_end();
178 template<concepts::InvocableTo<meta::WriterResult<
void, Writer>, ObjectSerializerProxy&> F>
180 DI_TRY(serialize_object_begin());
182 auto proxy = ObjectSerializerProxy(*
this);
184 return serialize_object_end();
187 template<
typename T, concepts::InstanceOf<reflection::Fields> M>
196 if (!
field.get(value).has_value()) {
208 template<
typename T, concepts::InstanceOf<reflection::Enumerators> M>
213 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
214 requires(M::is_bool() || M::is_string() || M::is_integer())
216 if constexpr (M::is_bool()) {
218 }
else if constexpr (M::is_string()) {
220 }
else if constexpr (M::is_integer()) {
225 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
235 template<
typename T, concepts::InstanceOf<reflection::Atom> M>
249 constexpr auto writer() && ->
Writer&& {
return util::move(*this).m_writer; }
253 DI_TRY(serialize_comma());
260 DI_TRY(serialize_comma());
267 if (m_state == State::Value) {
272 DI_TRY(serialize_newline());
273 DI_TRY(serialize_indent());
274 }
else if (m_indent > 0) {
275 DI_TRY(serialize_newline());
276 DI_TRY(serialize_indent());
282 DI_TRY(serialize_comma());
290 if (m_state != State::First) {
291 DI_TRY(serialize_newline());
292 DI_TRY(serialize_indent());
299 DI_TRY(serialize_comma());
307 if (m_state != State::First) {
308 DI_TRY(serialize_newline());
309 DI_TRY(serialize_indent());
318 if (pretty_print()) {
325 if (!pretty_print()) {
332 if (!pretty_print()) {
340 constexpr auto pretty_print() const ->
bool {
return m_config.is_pretty(); }
343 JsonSerializerConfig m_config;
344 usize m_indent { 0 };
345 State m_state { State::First };
354template<concepts::Impl<io::Reader> Reader>
358 template<concepts::Impl<io::Writer> Writer,
typename... Args>
364 template<concepts::Impl<io::Reader> Reader,
typename... Args>
375 template<concepts::Serializable<JsonSerializer<io::StringWriter<>>> T,
typename... Args>
377 constexpr auto operator()(T&& value, Args&&... args)
const {
387 template<concepts::Impl<io::Writer> Writer, concepts::Serializable<JsonSerializer<Writer>> T,
typename... Args>
390 constexpr auto operator()(
Writer&& writer, T&& value, Args&&... args)
const {
400using serialization::JsonFormat;
402using serialization::JsonSerializerConfig;
Definition string_view_impl_forward_declaration.h:7
Definition utf8_encoding.h:107
Definition bounded_format_context.h:9
Definition string_writer.h:14
A deserializer for the JSON format.
Definition json_serializer.h:355
constexpr JsonDeserializer(T &&reader)
Definition json_deserializer.h:46
Definition json_serializer.h:36
constexpr auto pretty() const -> JsonSerializerConfig
Definition json_serializer.h:40
constexpr auto indent_width(int width) const -> JsonSerializerConfig
Definition json_serializer.h:46
JsonSerializerConfig()=default
constexpr auto is_pretty() const -> bool
Definition json_serializer.h:52
constexpr auto indent_width() const -> int
Definition json_serializer.h:53
Definition json_serializer.h:61
constexpr auto serialize_array(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:171
constexpr auto writer() &-> Writer &
Definition json_serializer.h:247
constexpr auto serialize(T value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:209
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:188
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:239
constexpr auto writer() &&-> Writer &&
Definition json_serializer.h:249
JsonFormat SerializationFormat
Definition json_serializer.h:125
constexpr auto serialize_null() -> meta::WriterResult< void, Writer >
Definition json_serializer.h:132
constexpr auto serialize_number(concepts::Integral auto number) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:156
constexpr auto serialize_string(container::StringView view) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:146
constexpr JsonSerializer(T &&writer, JsonSerializerConfig config={})
Definition json_serializer.h:129
constexpr auto serialize_bool(bool value) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:139
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:227
constexpr auto serialize(T &&value, M) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:215
constexpr auto serialize_object(F &&function) -> meta::WriterResult< void, Writer >
Definition json_serializer.h:179
constexpr auto writer() const &-> Writer const &
Definition json_serializer.h:248
Definition reference_wrapper.h:14
Definition operations.h:11
Definition language.h:224
Definition serialize.h:175
Definition tuple_like.h:38
Definition constant_string.h:8
constexpr usize width
Definition gfx_test.cpp:21
#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 > Writer
Definition writer.h:59
Definition json_deserializer.h:532
constexpr auto enum_to_string
Definition enum_to_string.h:25
Definition binary_deserializer.h:33
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:371
constexpr auto serialize_json
Definition json_serializer.h:396
constexpr auto to_json_string
Definition json_serializer.h:383
constexpr auto serializer
Definition serialize.h:43
size_t usize
Definition integers.h:33
__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 zstring_parser.h:9
constexpr auto field
Definition field.h:42
Definition json_serializer.h:386
Definition json_serializer.h:374