userver
userver copied to clipboard
feat formats: automatic serialization/deserialization based on Boost.PFR
Example
#include <userver/formats/json.hpp>
#include <userver/formats/universal/universal.hpp>
#include <userver/formats/universal/common_containers.hpp>
#include <iostream>
struct SomeStruct {
std::optional<int> field;
std::string field2;
};
template <>
inline constexpr auto userver::formats::universal::kSerialization<SomeStruct> =
SerializationConfig<SomeStruct>()
.With<"field">({.Maximum = 1221, .Minimum = 12, .Default = 124})
.With<"field2">({.Pattern = kPattern<"^[0-9]+$">});
int main() {
userver::formats::json::ValueBuilder builder(SomeStruct{{}, "121"});
auto json = builder.ExtractValue();
std::cout << userver::formats::json::ToString(json) << std::endl; // {"field":124,"field2":"121"}
std::cout << json.As<SomeStruct>().field << std::endl; // 124
};
In a separate .hpp
, let's add an easy way to plug utils::TrivialBiMap
into serialization of optionals
It should allow to write something like:
template <>
inline constexpr auto formats::enums::kEnumMapping<SomeEnum> = [](auto selector) {
return selector
.Case(SomeEnum::kFoo, "foo")
.Case(SomeEnum::kBar, "bar");
};
and get:
-
Parse
-
Serialize
-
formats::enums::ToString
(although it won't be ADL-found, but still useful) -
formats::enums::ParseFromString
? (same ^)