C++ Client-Side SDK
LaunchDarkly SDK
Loading...
Searching...
No Matches
attributes_builder.hpp
1#pragma once
2
3#include <launchdarkly/attribute_reference.hpp>
4#include <launchdarkly/attributes.hpp>
5#include <launchdarkly/value.hpp>
6
7#include <map>
8#include <string>
9
10namespace launchdarkly {
11class ContextBuilder;
12
21template <class BuilderReturn, class BuildType>
22class AttributesBuilder final {
23 friend class ContextBuilder;
24
25public:
33 AttributesBuilder(BuilderReturn& builder, std::string kind, std::string key)
34 : builder_(builder), kind_(std::move(kind)), key_(std::move(key)) {
35 }
36
45 AttributesBuilder(BuilderReturn& builder,
46 std::string kind,
47 Attributes const& attributes)
48 : builder_(builder),
49 kind_(std::move(kind)),
50 key_(attributes.Key()),
51 name_(attributes.Name()),
52 anonymous_(attributes.Anonymous()),
53 private_attributes_(attributes.PrivateAttributes()) {
54 for (auto& pair : attributes.CustomAttributes().AsObject()) {
55 values_[pair.first] = pair.second;
56 }
57 }
58
63 AttributesBuilder(AttributesBuilder const& builder) = delete;
64 AttributesBuilder& operator=(AttributesBuilder const&) = delete;
65 AttributesBuilder& operator=(AttributesBuilder&&) = delete;
66
67 // This cannot be noexcept because of:
68 // https://developercommunity.visualstudio.com/t/bug-in-stdmapstdpair-implementation-with-move-only/840554
69 AttributesBuilder(AttributesBuilder&& builder) = default;
70 ~AttributesBuilder() = default;
71
80 AttributesBuilder& Name(std::string name);
81
89 AttributesBuilder& Anonymous(bool anonymous);
90
104 AttributesBuilder& Set(std::string name, Value value);
105
123 AttributesBuilder& SetPrivate(std::string name, Value value);
124
170
178 template <typename IterType>
180 for (auto iter : attributes) {
181 private_attributes_.insert(iter);
182 }
183 return *this;
184 }
185
198 AttributesBuilder& Kind(std::string kind, std::string key) {
199 return builder_.Kind(kind, key);
200 }
201
209 AttributesBuilder* Kind(std::string const& kind) {
210 return builder_.Kind(kind);
211 }
212
218 [[nodiscard]] BuildType Build() const { return builder_.Build(); }
219
220private:
221 BuilderReturn& builder_;
222
228 void Key(std::string key) { key_ = std::move(key); }
229
230 Attributes BuildAttributes() const;
231
232 AttributesBuilder& Set(std::string name,
233 Value value,
234 bool private_attribute);
235
236
237 std::string kind_;
238 std::string key_;
239 std::string name_;
240 bool anonymous_ = false;
241
242 std::map<std::string, Value> values_;
243 AttributeReference::SetType private_attributes_;
244};
245} // namespace launchdarkly
Definition attribute_reference.hpp:34
Definition attributes_builder.hpp:22
AttributesBuilder(BuilderReturn &builder, std::string kind, Attributes const &attributes)
Definition attributes_builder.hpp:45
AttributesBuilder & Kind(std::string kind, std::string key)
Definition attributes_builder.hpp:198
AttributesBuilder(BuilderReturn &builder, std::string kind, std::string key)
Definition attributes_builder.hpp:33
AttributesBuilder & AddPrivateAttribute(AttributeReference ref)
BuildType Build() const
Definition attributes_builder.hpp:218
AttributesBuilder * Kind(std::string const &kind)
Definition attributes_builder.hpp:209
AttributesBuilder & AddPrivateAttributes(IterType attributes)
Definition attributes_builder.hpp:179
AttributesBuilder & Set(std::string name, Value value)
AttributesBuilder & Anonymous(bool anonymous)
AttributesBuilder & Name(std::string name)
AttributesBuilder(AttributesBuilder const &builder)=delete
AttributesBuilder & SetPrivate(std::string name, Value value)
Definition attributes.hpp:15
Value const & CustomAttributes() const
Definition attributes.cpp:17
Definition context_builder.hpp:62
Definition value.hpp:42
Object const & AsObject() const
Definition value.cpp:121