C++ Server-Side SDK
LaunchDarkly SDK
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 
10 namespace launchdarkly {
11 class ContextBuilder;
12 
21 template <class BuilderReturn, class BuildType>
22 class AttributesBuilder final {
23  friend class ContextBuilder;
24 
25 public:
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>
179  AttributesBuilder& AddPrivateAttributes(IterType attributes) {
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 
220 private:
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 & Set(std::string name, Value value)
AttributesBuilder(BuilderReturn &builder, std::string kind, std::string key)
Definition: attributes_builder.hpp:33
AttributesBuilder & Kind(std::string kind, std::string key)
Definition: attributes_builder.hpp:198
BuildType Build() const
Definition: attributes_builder.hpp:218
AttributesBuilder & Name(std::string name)
AttributesBuilder & AddPrivateAttributes(IterType attributes)
Definition: attributes_builder.hpp:179
AttributesBuilder & SetPrivate(std::string name, Value value)
AttributesBuilder * Kind(std::string const &kind)
Definition: attributes_builder.hpp:209
AttributesBuilder(AttributesBuilder const &builder)=delete
AttributesBuilder & Anonymous(bool anonymous)
AttributesBuilder & AddPrivateAttribute(AttributeReference ref)
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