userver: userver/dynamic_config/impl/snapshot.hpp Source File
Loading...
Searching...
No Matches
snapshot.hpp
1#pragma once
2
3#include <any>
4#include <cstddef>
5#include <exception>
6#include <type_traits>
7#include <typeindex>
8#include <typeinfo>
9#include <vector>
10
11#include <userver/dynamic_config/fwd.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace dynamic_config::impl {
16
17using Factory = std::any (*)(const DocsMap&);
18
19template <typename Key>
20using VariableOfKey = decltype(Key::Parse(std::declval<const DocsMap&>()));
21
22template <typename Key>
23std::any FactoryFor(const DocsMap& map) {
24 return std::any{Key::Parse(map)};
25}
26
27[[noreturn]] void WrapGetError(const std::exception& ex, std::type_index type);
28
29template <typename T>
30T ParseByConstructor(const DocsMap& docs_map) {
31 return T(docs_map);
32}
33
34using ConfigId = std::size_t;
35
36ConfigId Register(Factory factory);
37
38// Automatically registers all used config types at startup and assigns them
39// sequential ids
40template <typename Key>
41inline const ConfigId kConfigId = Register(&FactoryFor<Key>);
42
43class SnapshotData final {
44 public:
45 SnapshotData() = default;
46
47 SnapshotData(const std::vector<KeyValue>& config_variables);
48
49 SnapshotData(const DocsMap& defaults, const std::vector<KeyValue>& overrides);
50
51 SnapshotData(const SnapshotData& defaults,
52 const std::vector<KeyValue>& overrides);
53
54 SnapshotData(SnapshotData&&) noexcept = default;
55 SnapshotData& operator=(SnapshotData&&) noexcept = default;
56
57 template <typename Key>
58 const auto& operator[](Key) const {
59 using VariableType = VariableOfKey<Key>;
60 try {
61 return std::any_cast<const VariableType&>(Get(impl::kConfigId<Key>));
62 } catch (const std::exception& ex) {
63 impl::WrapGetError(ex, typeid(VariableType));
64 }
65 }
66
67 bool IsEmpty() const noexcept;
68
69 private:
70 const std::any& Get(impl::ConfigId id) const;
71
72 std::vector<std::any> user_configs_;
73};
74
75class StorageData;
76
77} // namespace dynamic_config::impl
78
79USERVER_NAMESPACE_END