53 struct SC_SERIALIZATION_TEXT_EXPORT
Options
68 template <
typename T,
typename B>
71 GrowableBuffer<B> gb = {buffer};
72 SerializationTextOutput output(gb);
74 Writer stream(output, options);
75 if (not stream.onSerializationStart())
77 output.onFormatFailed();
80 if (not Serialization::SerializationTextReadWriteExact<Writer, T>::serialize(0,
object, stream))
82 output.onFormatFailed();
85 return stream.onSerializationEnd();
98 [[nodiscard]]
static bool loadExact(T&
object, StringSpan text)
101 return Serialization::SerializationTextReadWriteExact<Reader, T>::serialize(0,
object, stream);
110 template <
typename T>
114 return Serialization::SerializationTextReadVersioned<Reader, T, void>::loadVersioned(0,
object, stream);
120 struct SC_SERIALIZATION_TEXT_EXPORT Writer
122 SerializationTextOutput& output;
124 Writer(SerializationTextOutput& output, Options options) : output(output), options(options) {}
126 [[nodiscard]]
bool onSerializationStart();
127 [[nodiscard]]
bool onSerializationEnd();
129 [[nodiscard]]
bool setOptions(Options opt);
131 [[nodiscard]]
bool startObject(uint32_t index);
132 [[nodiscard]]
bool endObject();
134 [[nodiscard]]
bool startArray(uint32_t index);
135 [[nodiscard]]
bool endArray();
137 template <
typename Container>
138 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
140 if (not eventuallyAddComma(index))
142 size =
static_cast<uint32_t
>(container.size());
143 return output.append(
"[");
146 template <
typename Container>
147 [[nodiscard]]
bool endArrayItem(Container&, uint32_t&)
152 [[nodiscard]]
bool startObjectField(uint32_t index, StringSpan text);
154 template <
typename T>
156 typename TypeTraits::EnableIf<not Serialization::SerializationTextIsBaseOf<StringSpan, T>::value,
157 bool>::type serialize(uint32_t index, T& text)
159 return serializeStringSpan(index, text.view());
162 [[nodiscard]]
bool serialize(uint32_t index, StringSpan text);
163 [[nodiscard]]
bool serialize(uint32_t index,
float value);
164 [[nodiscard]]
bool serialize(uint32_t index,
double value);
165 [[nodiscard]]
bool serialize(uint32_t index,
int value);
168 [[nodiscard]]
bool serializeStringSpan(uint32_t index, StringSpan text);
170 bool eventuallyAddComma(uint32_t index);
177 struct SC_SERIALIZATION_TEXT_EXPORT Reader
179 Reader(StringSpan text) : iteratorText(text), iterator(text) {}
181 [[nodiscard]]
bool onSerializationStart() {
return true; }
182 [[nodiscard]]
bool onSerializationEnd() {
return true; }
184 [[nodiscard]]
bool startObject(uint32_t index);
185 [[nodiscard]]
bool endObject();
187 [[nodiscard]]
bool startArray(uint32_t index);
188 [[nodiscard]]
bool endArray();
190 template <
typename Container>
191 [[nodiscard]]
bool startArray(uint32_t index, Container& container, uint32_t& size)
193 if (not tokenizeArrayStart(index))
195 return endArrayItem(container, size);
198 template <
typename Container>
199 [[nodiscard]]
bool endArrayItem(Container& container, uint32_t& size)
202 if (not tokenizeArrayEnd(size))
205 return Reflection::ExtendedTypeInfo<Container>::resize(container, size);
209 [[nodiscard]]
bool startObjectField(uint32_t index, StringSpan text);
210 [[nodiscard]]
bool getNextField(uint32_t index, StringSpan& text,
bool& hasMore);
212 [[nodiscard]]
bool serialize(uint32_t index,
bool& value);
213 [[nodiscard]]
bool serialize(uint32_t index,
float& value);
214 [[nodiscard]]
bool serialize(uint32_t index, int32_t& value);
215 [[nodiscard]]
bool serialize(uint32_t index, StringSpan& value);
217 template <
typename T>
219 typename TypeTraits::EnableIf<not Serialization::SerializationTextIsBaseOf<StringSpan, T>::value,
220 bool>::type serialize(uint32_t index, T& text)
223 auto escaped = serializeInternal(index, succeeded);
227 GrowableBuffer<T> gb = {text};
228 SerializationTextOutput output(gb);
230 output.onFormatBegin();
231 if (not appendJSONStringUnescaped(escaped, output))
233 output.onFormatFailed();
236 return output.onFormatSucceeded();
240 [[nodiscard]]
static bool appendJSONStringUnescaped(StringSpan escaped, SerializationTextOutput& output);
241 [[nodiscard]] StringSpan serializeInternal(uint32_t index,
bool& succeeded);
243 [[nodiscard]]
bool tokenizeArrayStart(uint32_t index);
244 [[nodiscard]]
bool tokenizeArrayEnd(uint32_t& size);
245 [[nodiscard]]
bool eventuallyExpectComma(uint32_t index);
247 StringSpan iteratorText;
248 JsonTokenizer::Cursor iterator;