Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
config.hh
Go to the documentation of this file.
1#pragma once
3
4#include <cassert>
5#include <map>
6#include <set>
7
8#include "lix/libutil/json-fwd.hh"
13
14namespace nix {
15
47
48class Args;
49class AbstractSetting;
50
51class AbstractConfig
52{
53protected:
54 StringMap unknownSettings;
55
56 AbstractConfig(StringMap initials = {});
57
58public:
59
64 virtual bool set(const std::string & name, const std::string & value, const ApplyConfigOptions & options = {}) = 0;
65
67 {
68 std::string value;
69 std::string description;
70 };
71
77 virtual void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) = 0;
78
84 void applyConfig(const std::string & contents, const ApplyConfigOptions & options = {});
85
89 virtual void resetOverridden() = 0;
90
95 virtual JSON toJSON() = 0;
96
102 virtual void convertToArgs(Args & args, const std::string & category) = 0;
103
107 void warnUnknownSettings();
108
113};
114
130class Config : public AbstractConfig
131{
132 friend class AbstractSetting;
133
134public:
135
137 {
138 bool isAlias;
139 AbstractSetting * setting;
140 };
141
142 using Settings = std::map<std::string, SettingData>;
143
144private:
145
146 Settings _settings;
147
148public:
149
150 Config(StringMap initials = {});
151
152 bool set(const std::string & name, const std::string & value, const ApplyConfigOptions & options = {}) override;
153
154 void addSetting(AbstractSetting * setting);
155
156 void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) override;
157
158 void resetOverridden() override;
159
160 JSON toJSON() override;
161
162 void convertToArgs(Args & args, const std::string & category) override;
163};
164
165class AbstractSetting
166{
167 friend class Config;
168
169public:
170
171 struct deprecated_t {
172 explicit deprecated_t() = default;
173 };
174
175 const std::string name;
176 const std::string description;
177 const std::set<std::string> aliases;
178
179 int created = 123;
180
181 bool overridden = false;
182
183 std::optional<ExperimentalFeature> experimentalFeature;
184
185protected:
186
187 AbstractSetting(
188 const std::string & name,
189 const std::string & description,
190 const std::set<std::string> & aliases,
191 std::optional<ExperimentalFeature> experimentalFeature = std::nullopt);
192
193 virtual ~AbstractSetting();
194
195 virtual void set(const std::string & value, bool append = false, const ApplyConfigOptions & options = {}) = 0;
196
201 virtual bool isAppendable() = 0;
202
203 virtual std::string to_string() const = 0;
204
205 JSON toJSON();
206
207 virtual std::map<std::string, JSON> toJSONObject() const;
208
209 virtual void convertToArg(Args & args, const std::string & category);
210
211 bool isOverridden() const;
212
213};
214
218template<typename T>
219class BaseSetting : public AbstractSetting
220{
221protected:
222
223 T value;
224 const T defaultValue;
225 const bool documentDefault;
226 const bool deprecated;
227
233 virtual T parse(const std::string & str, const ApplyConfigOptions & options) const;
234
243 virtual void appendOrSet(T newValue, bool append, const ApplyConfigOptions & options);
244
245public:
246
247 BaseSetting(const T & def,
248 const bool documentDefault,
249 const std::string & name,
250 const std::string & description,
251 const std::set<std::string> & aliases = {},
252 std::optional<ExperimentalFeature> experimentalFeature = std::nullopt,
253 bool deprecated = false)
254 : AbstractSetting(name, description, aliases, experimentalFeature)
255 , value(def)
256 , defaultValue(def)
257 , documentDefault(documentDefault)
258 , deprecated(deprecated)
259 { }
260
261 operator const T &() const { return value; }
262 const T & get() const { return value; }
263 template<typename U>
264 bool operator ==(const U & v2) const { return value == v2; }
265 template<typename U>
266 bool operator !=(const U & v2) const { return value != v2; }
267 template<typename U>
268 void setDefault(const U & v) { if (!overridden) value = v; }
269
276 void set(const std::string & str, bool append = false, const ApplyConfigOptions & options = {}) override final;
277
278 void override(const T & v);
279
284 struct trait;
285
290 bool isAppendable() override final;
291
292 std::string to_string() const override;
293
294 void convertToArg(Args & args, const std::string & category) override;
295
296 std::map<std::string, JSON> toJSONObject() const override;
297};
298
299template<typename T>
300std::ostream & operator <<(std::ostream & str, const BaseSetting<T> & opt)
301{
302 return str << static_cast<const T &>(opt);
303}
304
305template<typename T>
306bool operator ==(const T & v1, const BaseSetting<T> & v2) { return v1 == static_cast<const T &>(v2); }
307
308template<typename T>
309class Setting : public BaseSetting<T>
310{
311public:
312 Setting(Config * options,
313 const T & def,
314 const std::string & name,
315 const std::string & description,
316 const std::set<std::string> & aliases = {},
317 const bool documentDefault = true,
318 std::optional<ExperimentalFeature> experimentalFeature = std::nullopt,
319 bool deprecated = false)
320 : BaseSetting<T>(def, documentDefault, name, description, aliases, std::move(experimentalFeature), deprecated)
321 {
322 options->addSetting(this);
323 }
324};
325
331template<typename T>
332class PathsSetting : public BaseSetting<T>
333{
334public:
335 PathsSetting(Config * options,
336 const T & def,
337 const std::string & name,
338 const std::string & description,
339 const std::set<std::string> & aliases = {},
340 const bool documentDefault = true,
341 std::optional<ExperimentalFeature> experimentalFeature = std::nullopt,
342 bool deprecated = false)
343 : BaseSetting<T>(def, documentDefault, name, description, aliases, std::move(experimentalFeature), deprecated)
344 {
345 options->addSetting(this);
346 }
347
348 T parse(const std::string & str, const ApplyConfigOptions & options) const override;
349};
350
351
352struct GlobalConfig : public AbstractConfig
353{
354 typedef std::vector<Config*> ConfigRegistrations;
355 static ConfigRegistrations * configRegistrations;
356
357 bool set(const std::string & name, const std::string & value, const ApplyConfigOptions & options = {}) override;
358
359 void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) override;
360
361 void resetOverridden() override;
362
363 JSON toJSON() override;
364
369 std::string toKeyValue(bool overriddenOnly = false);
370
371 void convertToArgs(Args & args, const std::string & category) override;
372
373 struct Register
374 {
375 Register(Config * config);
376 };
377};
378
379extern GlobalConfig globalConfig;
380
381
382struct FeatureSettings : Config {
383 #include "feature-settings.gen.inc"
384
388 bool isEnabled(const ExperimentalFeature &) const;
389
394 void require(const ExperimentalFeature &) const;
395
400 bool isEnabled(const std::optional<ExperimentalFeature> &) const;
401
406 void require(const std::optional<ExperimentalFeature> &) const;
407
411 bool isEnabled(const DeprecatedFeature &) const;
412
417 void require(const DeprecatedFeature &) const;
418
423 bool isEnabled(const std::optional<DeprecatedFeature> &) const;
424
429 void require(const std::optional<DeprecatedFeature> &) const;
430};
431
432// FIXME: don't use a global variable.
433extern FeatureSettings& featureSettings;
434
435// Aliases to `featureSettings` for not having to change the name in the code everywhere
436using ExperimentalFeatureSettings = FeatureSettings;
437extern FeatureSettings experimentalFeatureSettings;
438}
Options for applying Config settings.
void warnUnknownSettings()
Definition config.cc:70
void reapplyUnknownSettings()
Definition config.cc:76
virtual JSON toJSON()=0
virtual void getSettings(std::map< std::string, SettingInfo > &res, bool overriddenOnly=false)=0
void applyConfig(const std::string &contents, const ApplyConfigOptions &options={})
Definition config.cc:159
virtual void resetOverridden()=0
virtual void convertToArgs(Args &args, const std::string &category)=0
virtual bool set(const std::string &name, const std::string &value, const ApplyConfigOptions &options={})=0
Definition config.hh:166
virtual bool isAppendable()=0
Definition args.hh:31
Definition config.hh:220
virtual void appendOrSet(T newValue, bool append, const ApplyConfigOptions &options)
Definition config-impl.hh:62
virtual T parse(const std::string &str, const ApplyConfigOptions &options) const
Definition config-impl.hh:136
bool isAppendable() override final
Definition config-impl.hh:50
void set(const std::string &str, bool append=false, const ApplyConfigOptions &options={}) override final
Definition config-impl.hh:72
Definition config.hh:131
void resetOverridden() override
Definition config.cc:175
void getSettings(std::map< std::string, SettingInfo > &res, bool overriddenOnly=false) override
Definition config.cc:84
JSON toJSON() override
Definition config.cc:181
void convertToArgs(Args &args, const std::string &category) override
Definition config.cc:190
bool set(const std::string &name, const std::string &value, const ApplyConfigOptions &options={}) override
Definition config.cc:21
T parse(const std::string &str, const ApplyConfigOptions &options) const override
DeprecatedFeature
Definition deprecated-features.hh:18
ExperimentalFeature
Definition experimental-features.hh:15
Definition config.hh:67
Definition apply-config-options.hh:15
Definition globals.cc:313
Definition config.hh:137
Definition config.hh:382
bool isEnabled(const ExperimentalFeature &) const
Definition config.cc:581
void require(const ExperimentalFeature &) const
Definition config.cc:587
Definition config.hh:353
bool set(const std::string &name, const std::string &value, const ApplyConfigOptions &options={}) override
Definition config.cc:518
std::string toKeyValue(bool overriddenOnly=false)
Definition config.cc:548
JSON toJSON() override
Definition config.cc:540
void getSettings(std::map< std::string, SettingInfo > &res, bool overriddenOnly=false) override
Definition config.cc:528
void convertToArgs(Args &args, const std::string &category) override
Definition config.cc:558
void resetOverridden() override
Definition config.cc:534