userver: userver/chaotic/variant.hpp Source File
Loading...
Searching...
No Matches
variant.hpp
1#pragma once
2
3#include <variant>
4
5#include <userver/formats/json/value.hpp>
6#include <userver/formats/parse/to.hpp>
7#include <userver/formats/serialize/to.hpp>
8#include <userver/utils/meta.hpp>
9#include <userver/utils/overloaded.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace chaotic {
14
15template <typename... T>
16auto& GetVariant(std::variant<T...>& arg) {
17 return arg;
18}
19
20template <typename... T>
21const auto& GetVariant(const std::variant<T...>& arg) {
22 return arg;
23}
24
25template <typename T>
26decltype(T().AsVariant()) GetVariant(T& arg) {
27 return arg.AsVariant();
28}
29
30template <typename... T>
31struct Variant final {
32 const std::variant<decltype(Parse(std::declval<formats::json::Value>(),
33 formats::parse::To<T>{}))...>& value;
34};
35
36template <typename Value, typename... T>
37auto Parse(const Value& value, formats::parse::To<Variant<T...>>) {
38 return value.template As<std::variant<T...>>();
39}
40
41template <typename Value, typename... T>
42Value Serialize(const Variant<T...>& var, formats::serialize::To<Value>) {
43 return std::visit(
44 utils::Overloaded{[](const formats::common::ParseType<Value, T>& item) {
45 return typename Value::Builder(T{item}).ExtractValue();
46 }...},
47 var.value);
48}
49
50} // namespace chaotic
51
52USERVER_NAMESPACE_END