4#include "Stroika/Foundation/StroikaPreComp.h"
21#include "ObjectVariantMapper.h"
54 sb <<
"for-type: "sv << fForType_;
65String ObjectVariantMapper::TypesRegistry::ToString ()
const
69 sb <<
"type-mappers: "sv << fSerializers_.Keys ();
80 template <
typename T,
typename UseVariantType>
81 TypeMappingDetails mkSerializerInfo_ ()
85 return VariantValue{
static_cast<UseVariantType
> (*fromObjOfTypeT)};
89 *intoObjOfTypeT =
static_cast<T
> (d.As<UseVariantType> ());
91 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
96TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<bool> ()
98 return mkSerializerInfo_<bool, bool> ();
102TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<signed char> ()
104 return mkSerializerInfo_<signed char, signed char> ();
108TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<short int> ()
110 return mkSerializerInfo_<short int, short int> ();
114TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<int> ()
116 return mkSerializerInfo_<int, int> ();
120TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long int> ()
122 return mkSerializerInfo_<long int, long int> ();
126TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long long int> ()
128 return mkSerializerInfo_<long long int, long long int> ();
132TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned char> ()
134 return mkSerializerInfo_<unsigned char, unsigned char> ();
138TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned short int> ()
140 return mkSerializerInfo_<unsigned short int, unsigned short int> ();
144TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned int> ()
146 return mkSerializerInfo_<unsigned int, unsigned int> ();
150TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned long int> ()
152 return mkSerializerInfo_<unsigned long int, unsigned long int> ();
156TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<unsigned long long int> ()
158 return mkSerializerInfo_<unsigned long long int, unsigned long long int> ();
162TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<float> ()
164 return mkSerializerInfo_<float, float> ();
168TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<double> ()
170 return mkSerializerInfo_<double, double> ();
174TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<long double> ()
176 return mkSerializerInfo_<long double, long double> ();
180TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<filesystem::path> ()
186 ToObjectMapperType<filesystem::path> toObjectMapper = [] (
const ObjectVariantMapper&,
const VariantValue& d, filesystem::path* intoObjOfTypeT) ->
void {
188 *intoObjOfTypeT = d.As<
String> ().As<filesystem::path> ();
190 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (filesystem::path)};
194TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::Date> ()
196 return mkSerializerInfo_<Time::Date, Time::Date> ();
200TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::DateTime> ()
202 return mkSerializerInfo_<Time::DateTime, Time::DateTime> ();
206TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Characters::String> ()
208 return mkSerializerInfo_<Characters::String, Characters::String> ();
212TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<VariantValue> ()
219 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (
VariantValue)};
223TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::Duration> ()
231 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (
Duration)};
235TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::DurationSeconds> ()
244 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (
DurationSeconds)};
248TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Time::TimeOfDay> ()
250 FromObjectMapperType<Time::TimeOfDay> fromObjectMapper = [] ([[maybe_unused]]
const ObjectVariantMapper&,
252 return VariantValue{fromObjOfTypeT->GetAsSecondsCount ()};
258 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (
TimeOfDay)};
262TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Containers::Mapping<Characters::String, Characters::String>> ()
265 FromObjectMapperType<ACTUAL_ELEMENT_TYPE> fromObjectMapper = [] (
const ObjectVariantMapper&,
const ACTUAL_ELEMENT_TYPE* fromObjOfTypeT) ->
VariantValue {
267 for (
const auto& i : *fromObjOfTypeT) {
270 m.
Add (i.fKey, i.fValue);
275 ACTUAL_ELEMENT_TYPE* intoObjOfTypeT) ->
void {
277 intoObjOfTypeT->
clear ();
278 for (
const auto& i : m) {
281 intoObjOfTypeT->Add (i.fKey, i.fValue.As<
String> ());
284 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (ACTUAL_ELEMENT_TYPE)};
288TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer<Containers::Mapping<Characters::String, VariantValue>> ()
291 FromObjectMapperType<ACTUAL_ELEMENT_TYPE> fromObjectMapper =
294 ACTUAL_ELEMENT_TYPE* intoObjOfTypeT) ->
void {
297 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (ACTUAL_ELEMENT_TYPE)};
300TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (
const Memory::BLOB*)
307 return VariantValue{
String{Cryptography::Encoding::Algorithm::Base64::Encode (*fromObjOfTypeT)}};
310 *intoObjOfTypeT = Cryptography::Encoding::Algorithm::Base64::Decode (d.As<
String> ());
312 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
315TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (
const InternetMediaType*)
322 *intoObjOfTypeT = T{d.
As<
String> ()};
324 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
327TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (
const TypedBLOB*)
329 return MakeClassSerializer<TypedBLOB> ({
330 {
"data"sv, {&TypedBLOB::fData}},
331 {
"type"sv, {&TypedBLOB::fType}},
335TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (
const IO::Network::CIDR*)
342 *intoObjOfTypeT = T{d.
As<
String> ()};
344 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
354 *intoObjOfTypeT = T{d.
As<
String> ()};
356 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
359TypeMappingDetails ObjectVariantMapper::MakeCommonSerializer_ (
const IO::Network::URI*)
366 *intoObjOfTypeT = T::Parse (d.As<
String> ());
368 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
374 Require (representAs == VariantValue::eBLOB or representAs == VariantValue::eString);
375 switch (representAs) {
376 case VariantValue::eBLOB: {
383 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
385 case VariantValue::eString: {
387 return fromObjOfTypeT->
As<
String> ();
392 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (T)};
396 return TypeMappingDetails{
nullptr,
nullptr,
typeid (T)};
408 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (
Duration)};
411 ObjectVariantMapper::TypesRegistry GetDefaultTypeMappers_ ()
413 using TypesRegistry = ObjectVariantMapper::TypesRegistry;
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>> (),
440 ObjectVariantMapper::MakeCommonSerializer<String> (),
441 ObjectVariantMapper::MakeCommonSerializer<TimeOfDay> (),
442 ObjectVariantMapper::MakeCommonSerializer<Traversal::Range<Duration>> (),
444 ObjectVariantMapper::MakeCommonSerializer<Traversal::DiscreteRange<Date>> (),
446 ObjectVariantMapper::MakeCommonSerializer<VariantValue> (),
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>> (),
472 ObjectVariantMapper::MakeCommonSerializer<optional<Mapping<String, VariantValue>>> (),
473 ObjectVariantMapper::MakeCommonSerializer<optional<String>> (),
474 ObjectVariantMapper::MakeCommonSerializer<optional<TimeOfDay>> (),
476 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::Range<Date>>> (),
478 ObjectVariantMapper::MakeCommonSerializer<optional<Traversal::Range<DateTime>>> (),
479 ObjectVariantMapper::MakeCommonSerializer<optional<VariantValue>> (),
486 : fTypeMappingRegistry_{GetDefaultTypeMappers_ ()}
492 fTypeMappingRegistry_.Add (s);
497 s.
Apply ([
this] (
const TypeMappingDetails& arg) {
Add (arg); });
502 s.GetMappers ().Apply ([
this] (
const TypeMappingDetails& arg) {
Add (arg); });
507 Add (s.fTypeMappingRegistry_);
512 fTypeMappingRegistry_ = GetDefaultTypeMappers_ ();
517 auto i = fTypeMappingRegistry_.Lookup (forTypeInfo);
519 if (not i.has_value ()) {
520 DbgTrace (
"ObjectVariantMapper::Lookup_ (forTypeInfo = {}) - UnRegistered Type!"_f, forTypeInfo);
523 Require (i.has_value ());
531 sb <<
"type-map-registry: "sv << fTypeMappingRegistry_;
543 if (fromObjOfTypeT->has_value ()) {
544 return mapper.
FromObject<T> (**fromObjOfTypeT);
552 if (d.GetType () == VariantValue::eNull) {
553 *intoObjOfTypeT = nullopt;
558 T tmp{IO::Network::V4::kLocalhost};
560 *intoObjOfTypeT = tmp;
563 return TypeMappingDetails{fromObjectMapper, toObjectMapper,
typeid (optional<T>)};
#define RequireNotReached()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
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,...
nonvirtual CONTAINER_OF_Key_T As() const
nonvirtual bool Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
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)
nonvirtual void ResetToDefaultTypeRegistry()
nonvirtual String ToString() const
TypedBLOB is a named tuple<Memory::BLOB, optional<InternetMediaType>> - with friendlier names,...
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
Type
Enumeration of variant types.
nonvirtual RETURNTYPE As() const
Duration is a chrono::duration<double> (=.
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.
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.
nonvirtual String ToString() const