userver: userver/dynamic_config/impl/snapshot.hpp Source File
⚠️ This is the documentation for an old userver version. Click here to switch to the latest version.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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