Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
ObjectVariantMapper.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
20
21#include "ObjectVariantMapper.h"
22
23using namespace Stroika::Foundation;
26
27using Time::Date;
28using Time::DateTime;
29using Time::Duration;
31using Time::TimeOfDay;
32
33// Comment this in to turn on aggressive noisy DbgTrace in this module
34//#define USE_NOISY_TRACE_IN_THIS_MODULE_ 1
35
36namespace {
37 template <typename T>
38 using FromObjectMapperType = ObjectVariantMapper::FromObjectMapperType<T>;
39 template <typename T>
40 using ToObjectMapperType = ObjectVariantMapper::ToObjectMapperType<T>;
41
42 using TypeMappingDetails = ObjectVariantMapper::TypeMappingDetails;
43}
44
45/*
46 ********************************************************************************
47 **************** DataExchange::ObjectVariantMapper::TypeMappingDetails *********
48 ********************************************************************************
49 */
51{
53 sb << "{"sv;
54 sb << "for-type: "sv << fForType_;
55 // @todo maybe also print function pointers? Not sure a good reason
56 sb << "}"sv;
57 return sb;
58}
59
60/*
61 ********************************************************************************
62 ****************** DataExchange::ObjectVariantMapper::TypesRegistry ************
63 ********************************************************************************
64 */
65String ObjectVariantMapper::TypesRegistry::ToString () const
66{
68 sb << "{"sv;
69 sb << "type-mappers: "sv << fSerializers_.Keys (); // for now the values are not interesting
70 sb << "}"sv;
71 return sb;
72}
73
74/*
75 ********************************************************************************
76 ********************* DataExchange::ObjectVariantMapper ************************
77 ********************************************************************************
78 */
79namespace {
80 template <typename T, typename UseVariantType>
81 TypeMappingDetails mkSerializerInfo_ ()
82 {
83 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
84 RequireNotNull (fromObjOfTypeT);
85 return VariantValue{static_cast<UseVariantType> (*fromObjOfTypeT)};
86 };
87 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
88 RequireNotNull (intoObjOfTypeT);
89 *intoObjOfTypeT = static_cast<T> (d.As<UseVariantType> ());
90 };
91 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
92 }
93}
94
95template <>
96TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<bool> ()
97{
98 return mkSerializerInfo_<bool, bool> ();
99}
100
101template <>
102TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<signed char> ()
103{
104 return mkSerializerInfo_<signed char, signed char> ();
105}
106
107template <>
108TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<short int> ()
109{
110 return mkSerializerInfo_<short int, short int> ();
111}
112
113template <>
114TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<int> ()
115{
116 return mkSerializerInfo_<int, int> ();
117}
118
119template <>
120TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long int> ()
121{
122 return mkSerializerInfo_<long int, long int> ();
123}
124
125template <>
126TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long long int> ()
127{
128 return mkSerializerInfo_<long long int, long long int> ();
129}
130
131template <>
132TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned char> ()
133{
134 return mkSerializerInfo_<unsigned char, unsigned char> ();
135}
136
137template <>
138TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned short int> ()
139{
140 return mkSerializerInfo_<unsigned short int, unsigned short int> ();
141}
142
143template <>
144TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned int> ()
145{
146 return mkSerializerInfo_<unsigned int, unsigned int> ();
147}
148
149template <>
150TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned long int> ()
151{
152 return mkSerializerInfo_<unsigned long int, unsigned long int> ();
153}
154
155template <>
156TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned long long int> ()
157{
158 return mkSerializerInfo_<unsigned long long int, unsigned long long int> ();
159}
160
161template <>
162TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<float> ()
163{
164 return mkSerializerInfo_<float, float> ();
165}
166
167template <>
168TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<double> ()
169{
170 return mkSerializerInfo_<double, double> ();
171}
172
173template <>
174TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long double> ()
175{
176 return mkSerializerInfo_<long double, long double> ();
177}
178
179template <>
180TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<filesystem::path> ()
181{
182 FromObjectMapperType<filesystem::path> fromObjectMapper = [] (const ObjectVariantMapper&, const filesystem::path* fromObjOfTypeT) -> VariantValue {
183 RequireNotNull (fromObjOfTypeT);
184 return VariantValue{String{*fromObjOfTypeT}};
185 };
186 ToObjectMapperType<filesystem::path> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, filesystem::path* intoObjOfTypeT) -> void {
187 RequireNotNull (intoObjOfTypeT);
188 *intoObjOfTypeT = d.As<String> ().As<filesystem::path> ();
189 };
190 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (filesystem::path)};
191}
192
193template <>
194TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::Date> ()
195{
196 return mkSerializerInfo_<Time::Date, Time::Date> ();
197}
198
199template <>
200TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::DateTime> ()
201{
202 return mkSerializerInfo_<Time::DateTime, Time::DateTime> ();
203}
204
205template <>
206TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Characters::String> ()
207{
208 return mkSerializerInfo_<Characters::String, Characters::String> ();
209}
210
211template <>
212TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<VariantValue> ()
213{
214 FromObjectMapperType<VariantValue> fromObjectMapper = [] (const ObjectVariantMapper&,
215 const VariantValue* fromObjOfTypeT) -> VariantValue { return *fromObjOfTypeT; };
216 ToObjectMapperType<VariantValue> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, VariantValue* intoObjOfTypeT) -> void {
217 *reinterpret_cast<VariantValue*> (intoObjOfTypeT) = d;
218 };
219 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (VariantValue)};
220}
221
222template <>
223TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::Duration> ()
224{
225 FromObjectMapperType<Time::Duration> fromObjectMapper = [] (const ObjectVariantMapper&, const Time::Duration* fromObjOfTypeT) -> VariantValue {
226 return VariantValue{fromObjOfTypeT->As<String> ()};
227 };
228 ToObjectMapperType<Time::Duration> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, Time::Duration* intoObjOfTypeT) -> void {
229 *intoObjOfTypeT = Duration{d.As<String> ()};
230 };
231 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (Duration)};
232}
233
234template <>
235TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::DurationSeconds> ()
236{
237 FromObjectMapperType<Time::DurationSeconds> fromObjectMapper = [] (const ObjectVariantMapper&, const Time::DurationSeconds* fromObjOfTypeT) -> VariantValue {
238 return VariantValue{Time::Duration{*fromObjOfTypeT}.As<String> ()};
239 };
240 ToObjectMapperType<Time::DurationSeconds> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d,
241 Time::DurationSeconds* intoObjOfTypeT) -> void {
242 *intoObjOfTypeT = Duration{d.As<String> ()};
243 };
244 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (DurationSeconds)};
245}
246
247template <>
248TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::TimeOfDay> ()
249{
250 FromObjectMapperType<Time::TimeOfDay> fromObjectMapper = [] ([[maybe_unused]] const ObjectVariantMapper&,
251 const Time::TimeOfDay* fromObjOfTypeT) -> VariantValue {
252 return VariantValue{fromObjOfTypeT->GetAsSecondsCount ()};
253 };
254 ToObjectMapperType<Time::TimeOfDay> toObjectMapper = [] ([[maybe_unused]] const ObjectVariantMapper&, const VariantValue& d,
255 Time::TimeOfDay* intoObjOfTypeT) -> void {
256 *reinterpret_cast<TimeOfDay*> (intoObjOfTypeT) = TimeOfDay{d.As<uint32_t> ()};
257 };
258 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (TimeOfDay)};
259}
260
261template <>
262TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Containers::Mapping<Characters::String, Characters::String>> ()
263{
264 using ACTUAL_ELEMENT_TYPE = Mapping<String, String>;
265 FromObjectMapperType<ACTUAL_ELEMENT_TYPE> fromObjectMapper = [] (const ObjectVariantMapper&, const ACTUAL_ELEMENT_TYPE* fromObjOfTypeT) -> VariantValue {
267 for (const auto& i : *fromObjOfTypeT) {
268 // really could do either way - but second more efficient
269 //m.Add (i.first, mapper.Serialize (typeid (String), reinterpret_cast<const byte*> (&i.second)));
270 m.Add (i.fKey, i.fValue);
271 }
272 return VariantValue{m};
273 };
274 ToObjectMapperType<ACTUAL_ELEMENT_TYPE> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d,
275 ACTUAL_ELEMENT_TYPE* intoObjOfTypeT) -> void {
277 intoObjOfTypeT->clear ();
278 for (const auto& i : m) {
279 // really could do either way - but second more efficient
280 //actualInto->Add (i.first, mapper.ToObject<String> (i.second));
281 intoObjOfTypeT->Add (i.fKey, i.fValue.As<String> ());
282 }
283 };
284 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (ACTUAL_ELEMENT_TYPE)};
285}
286
287template <>
288TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Containers::Mapping<Characters::String, VariantValue>> ()
289{
290 using ACTUAL_ELEMENT_TYPE = Mapping<String, VariantValue>;
291 FromObjectMapperType<ACTUAL_ELEMENT_TYPE> fromObjectMapper =
292 [] (const ObjectVariantMapper&, const ACTUAL_ELEMENT_TYPE* fromObjOfTypeT) -> VariantValue { return VariantValue{*fromObjOfTypeT}; };
293 ToObjectMapperType<ACTUAL_ELEMENT_TYPE> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d,
294 ACTUAL_ELEMENT_TYPE* intoObjOfTypeT) -> void {
295 *intoObjOfTypeT = d.As<Mapping<String, VariantValue>> ();
296 };
297 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (ACTUAL_ELEMENT_TYPE)};
298}
299
300TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const Memory::BLOB*)
301{
302 // No super obvious way to convert BLOB to/from JSON, but base64 encoding appears the best default
303 // Note - callers can easily replace this converter
304 // Note also - https://blog.kevinalbs.com/base122 - 33% increase - maybe base-122 better, but doesnt seem widely supported.
305 using T = Memory::BLOB;
306 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
307 return VariantValue{String{Cryptography::Encoding::Algorithm::Base64::Encode (*fromObjOfTypeT)}};
308 };
309 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
310 *intoObjOfTypeT = Cryptography::Encoding::Algorithm::Base64::Decode (d.As<String> ());
311 };
312 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
313}
314
315TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const InternetMediaType*)
316{
317 using T = InternetMediaType;
318 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
319 return VariantValue{fromObjOfTypeT->As<String> ()};
320 };
321 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
322 *intoObjOfTypeT = T{d.As<String> ()};
323 };
324 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
325}
326
327TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const TypedBLOB*)
328{
329 return MakeClassSerializer<TypedBLOB> ({
330 {"data"sv, {&TypedBLOB::fData}},
331 {"type"sv, {&TypedBLOB::fType}},
332 });
333}
334
335TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const IO::Network::CIDR*)
336{
337 using T = IO::Network::CIDR;
338 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
339 return VariantValue{fromObjOfTypeT->As<String> ()};
340 };
341 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
342 *intoObjOfTypeT = T{d.As<String> ()};
343 };
344 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
345}
346
347TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const IO::Network::InternetAddress*)
348{
350 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
351 return VariantValue{fromObjOfTypeT->As<String> ()};
352 };
353 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
354 *intoObjOfTypeT = T{d.As<String> ()};
355 };
356 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
357}
358
359TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const IO::Network::URI*)
360{
361 using T = IO::Network::URI;
362 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
363 return VariantValue{fromObjOfTypeT->As<String> ()};
364 };
365 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
366 *intoObjOfTypeT = T::Parse (d.As<String> ());
367 };
368 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
369}
370
371TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const Common::GUID*, VariantValue::Type representAs)
372{
373 using T = Common::GUID;
374 Require (representAs == VariantValue::eBLOB or representAs == VariantValue::eString);
375 switch (representAs) {
376 case VariantValue::eBLOB: {
377 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
378 return fromObjOfTypeT->As<Memory::BLOB> ();
379 };
380 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
381 *intoObjOfTypeT = Common::GUID{d.As<Memory::BLOB> ()};
382 };
383 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
384 }
385 case VariantValue::eString: {
386 FromObjectMapperType<T> fromObjectMapper = [] (const ObjectVariantMapper&, const T* fromObjOfTypeT) -> VariantValue {
387 return fromObjOfTypeT->As<String> ();
388 };
389 ToObjectMapperType<T> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, T* intoObjOfTypeT) -> void {
390 *intoObjOfTypeT = Common::GUID{d.As<String> ()};
391 };
392 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (T)};
393 }
394 default:
396 return TypeMappingDetails{nullptr, nullptr, typeid (T)};
397 }
398}
399
400TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const Time::Duration*, FloatConversion::Precision p)
401{
402 FromObjectMapperType<Time::Duration> fromObjectMapper = [p] (const ObjectVariantMapper&, const Time::Duration* fromObjOfTypeT) -> VariantValue {
403 return VariantValue{fromObjOfTypeT->As<String> (p)};
404 };
405 ToObjectMapperType<Time::Duration> toObjectMapper = [] (const ObjectVariantMapper&, const VariantValue& d, Time::Duration* intoObjOfTypeT) -> void {
406 *intoObjOfTypeT = Duration{d.As<String> ()};
407 };
408 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (Duration)};
409}
410namespace {
411 ObjectVariantMapper::TypesRegistry GetDefaultTypeMappers_ ()
412 {
413 using TypesRegistry = ObjectVariantMapper::TypesRegistry;
414 static const TypesRegistry sDefaults_ = {Set<TypeMappingDetails>{
415 ObjectVariantMapper::MakeCommonSerializer<bool> (),
416 ObjectVariantMapper::MakeCommonSerializer<signed char> (),
417 ObjectVariantMapper::MakeCommonSerializer<short int> (),
418 ObjectVariantMapper::MakeCommonSerializer<int> (),
419 ObjectVariantMapper::MakeCommonSerializer<long int> (),
420 ObjectVariantMapper::MakeCommonSerializer<long long int> (),
421 ObjectVariantMapper::MakeCommonSerializer<unsigned char> (),
422 ObjectVariantMapper::MakeCommonSerializer<unsigned short> (),
423 ObjectVariantMapper::MakeCommonSerializer<unsigned int> (),
424 ObjectVariantMapper::MakeCommonSerializer<unsigned long int> (),
425 ObjectVariantMapper::MakeCommonSerializer<unsigned long long int> (),
426 ObjectVariantMapper::MakeCommonSerializer<float> (),
427 ObjectVariantMapper::MakeCommonSerializer<double> (),
428 ObjectVariantMapper::MakeCommonSerializer<long double> (),
429 ObjectVariantMapper::MakeCommonSerializer<filesystem::path> (),
430 ObjectVariantMapper::MakeCommonSerializer<Date> (),
431 ObjectVariantMapper::MakeCommonSerializer<DateTime> (),
432 ObjectVariantMapper::MakeCommonSerializer<Duration> (),
433 ObjectVariantMapper::MakeCommonSerializer<DurationSeconds> (),
434 ObjectVariantMapper::MakeCommonSerializer<Common::GUID> (),
435 ObjectVariantMapper::MakeCommonSerializer<InternetMediaType> (),
436 ObjectVariantMapper::MakeCommonSerializer<IO::Network::InternetAddress> (),
437 ObjectVariantMapper::MakeCommonSerializer<IO::Network::URI> (),
438 ObjectVariantMapper::MakeCommonSerializer<Mapping<String, String>> (),
439 ObjectVariantMapper::MakeCommonSerializer<Mapping<String, VariantValue>> (),
440 ObjectVariantMapper::MakeCommonSerializer<String> (),
441 ObjectVariantMapper::MakeCommonSerializer<TimeOfDay> (),
442 ObjectVariantMapper::MakeCommonSerializer<Traversal::Range<Duration>> (),
443 ObjectVariantMapper::MakeCommonSerializer<Traversal::Range<Date>> (),
444 ObjectVariantMapper::MakeCommonSerializer<Traversal::DiscreteRange<Date>> (),
445 ObjectVariantMapper::MakeCommonSerializer<Traversal::Range<DateTime>> (),
446 ObjectVariantMapper::MakeCommonSerializer<VariantValue> (),
447
448 ObjectVariantMapper::MakeCommonSerializer<optional<bool>> (),
449 ObjectVariantMapper::MakeCommonSerializer<optional<signed char>> (),
450 ObjectVariantMapper::MakeCommonSerializer<optional<short int>> (),
451 ObjectVariantMapper::MakeCommonSerializer<optional<int>> (),
452 ObjectVariantMapper::MakeCommonSerializer<optional<long int>> (),
453 ObjectVariantMapper::MakeCommonSerializer<optional<long long int>> (),
454 ObjectVariantMapper::MakeCommonSerializer<optional<unsigned char>> (),
455 ObjectVariantMapper::MakeCommonSerializer<optional<unsigned short>> (),
456 ObjectVariantMapper::MakeCommonSerializer<optional<unsigned int>> (),
457 ObjectVariantMapper::MakeCommonSerializer<optional<unsigned long int>> (),
458 ObjectVariantMapper::MakeCommonSerializer<optional<unsigned long long int>> (),
459 ObjectVariantMapper::MakeCommonSerializer<optional<float>> (),
460 ObjectVariantMapper::MakeCommonSerializer<optional<double>> (),
461 ObjectVariantMapper::MakeCommonSerializer<optional<long double>> (),
462 ObjectVariantMapper::MakeCommonSerializer<optional<filesystem::path>> (),
463 ObjectVariantMapper::MakeCommonSerializer<optional<Date>> (),
464 ObjectVariantMapper::MakeCommonSerializer<optional<DateTime>> (),
465 ObjectVariantMapper::MakeCommonSerializer<optional<Duration>> (),
466 ObjectVariantMapper::MakeCommonSerializer<optional<DurationSeconds>> (),
467 ObjectVariantMapper::MakeCommonSerializer<optional<Common::GUID>> (),
468 ObjectVariantMapper::MakeCommonSerializer<optional<InternetMediaType>> (),
469 ObjectVariantMapper::MakeCommonSerializer<optional<IO::Network::InternetAddress>> (),
470 ObjectVariantMapper::MakeCommonSerializer<optional<IO::Network::URI>> (),
471 ObjectVariantMapper::MakeCommonSerializer<optional<Mapping<String, String>>> (),
472 ObjectVariantMapper::MakeCommonSerializer<optional<Mapping<String, VariantValue>>> (),
473 ObjectVariantMapper::MakeCommonSerializer<optional<String>> (),
474 ObjectVariantMapper::MakeCommonSerializer<optional<TimeOfDay>> (),
475 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::Range<Duration>>> (),
476 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::Range<Date>>> (),
477 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::DiscreteRange<Date>>> (),
478 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::Range<DateTime>>> (),
479 ObjectVariantMapper::MakeCommonSerializer<optional<VariantValue>> (),
480 }};
481 return sDefaults_;
482 }
483}
484
486 : fTypeMappingRegistry_{GetDefaultTypeMappers_ ()}
487{
488}
489
491{
492 fTypeMappingRegistry_.Add (s);
493}
494
496{
497 s.Apply ([this] (const TypeMappingDetails& arg) { Add (arg); });
498}
499
500void ObjectVariantMapper::Add (const TypesRegistry& s)
501{
502 s.GetMappers ().Apply ([this] (const TypeMappingDetails& arg) { Add (arg); });
503}
504
506{
507 Add (s.fTypeMappingRegistry_);
508}
509
511{
512 fTypeMappingRegistry_ = GetDefaultTypeMappers_ ();
513}
514
515ObjectVariantMapper::TypeMappingDetails ObjectVariantMapper::Lookup_ (const type_index& forTypeInfo) const
516{
517 auto i = fTypeMappingRegistry_.Lookup (forTypeInfo);
519 if (not i.has_value ()) {
520 DbgTrace ("ObjectVariantMapper::Lookup_ (forTypeInfo = {}) - UnRegistered Type!"_f, forTypeInfo); // failure almost always meand forgot to add dependent type earlier
521 }
522 }
523 Require (i.has_value ()); // if not present, this is a usage error - only use types which are registered
524 return *i;
525}
526
528{
530 sb << "{"sv;
531 sb << "type-map-registry: "sv << fTypeMappingRegistry_;
532 sb << "}"sv;
533 return sb;
534}
535
536// http://stroika-bugs.sophists.com/browse/STK-910
537template <>
538ObjectVariantMapper::TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (const optional<IO::Network::CIDR>*)
539{
540 using T = IO::Network::CIDR;
541 FromObjectMapperType<optional<T>> fromObjectMapper = [] (const ObjectVariantMapper& mapper, const optional<T>* fromObjOfTypeT) -> VariantValue {
542 RequireNotNull (fromObjOfTypeT);
543 if (fromObjOfTypeT->has_value ()) {
544 return mapper.FromObject<T> (**fromObjOfTypeT);
545 }
546 else {
547 return VariantValue{};
548 }
549 };
550 ToObjectMapperType<optional<T>> toObjectMapper = [] (const ObjectVariantMapper& mapper, const VariantValue& d, optional<T>* intoObjOfTypeT) -> void {
551 RequireNotNull (intoObjOfTypeT);
552 if (d.GetType () == VariantValue::eNull) {
553 *intoObjOfTypeT = nullopt;
554 }
555 else {
556 // SEE http://stroika-bugs.sophists.com/browse/STK-910
557 // fix here - I KNOW I have something there, but how to construct
558 T tmp{IO::Network::V4::kLocalhost};
559 mapper.ToObject<T> (d, &tmp);
560 *intoObjOfTypeT = tmp;
561 }
562 };
563 return TypeMappingDetails{fromObjectMapper, toObjectMapper, typeid (optional<T>)};
564}
#define RequireNotReached()
Definition Assertions.h:385
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
Definition Assertions.h:48
#define RequireNotNull(p)
Definition Assertions.h:347
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
Definition Realtime.h:57
#define DbgTrace
Definition Trace.h:309
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
nonvirtual CONTAINER_OF_Key_T As() const
nonvirtual bool Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
Definition Mapping.inl:190
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
Definition Set.h:105
ObjectVariantMapper can be used to map C++ types to and from variant-union types, which can be transp...
function< VariantValue(const ObjectVariantMapper &mapper, const T *objOfType)> FromObjectMapperType
nonvirtual VariantValue FromObject(const T &from) const
nonvirtual T ToObject(const VariantValue &v) const
function< void(const ObjectVariantMapper &mapper, const VariantValue &d, T *into)> ToObjectMapperType
nonvirtual void Add(const TypeMappingDetails &s)
TypedBLOB is a named tuple<Memory::BLOB, optional<InternetMediaType>> - with friendlier names,...
Definition TypedBLOB.h:48
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
Duration is a chrono::duration<double> (=.
Definition Duration.h:96
A DiscreteRange is a Range where the underlying endpoints are integral (discrete, not continuous); th...
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237
nonvirtual void Apply(const function< void(ArgByValueType< T > item)> &doToElement, Execution::SequencePolicy seq=Execution::SequencePolicy::eDEFAULT) const
Run the argument function (or lambda) on each element of the container.