userver icon indicating copy to clipboard operation
userver copied to clipboard

feat formats: automatic serialization/deserialization based on Boost.PFR

Open linuxnyasha opened this issue 1 year ago • 1 comments

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
};

linuxnyasha avatar Dec 27 '23 15:12 linuxnyasha

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 ^)

Anton3 avatar Mar 12 '24 08:03 Anton3