diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-06-07 16:17:17 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-06-07 16:17:17 +0200 |
commit | b8283773bd64d7da6859ed520ee19867742a03ba (patch) | |
tree | 040443ef177a1a5ec1795fe9bd52d2b050d2fee8 /src/libutil | |
parent | c8cc50d46e78de7ae02c2cb7a5159e995c993f61 (diff) |
nix: Make all options available as flags
Thus, instead of ‘--option <name> <value>’, you can write ‘--<name>
<value>’. So
--option http-connections 100
becomes
--http-connections 100
Apart from brevity, the difference is that it's not an error to set a
non-existent option via --option, but unrecognized arguments are
fatal.
Boolean options have special treatment: they're mapped to the
argument-less flags ‘--<name>’ and ‘--no-<name>’. E.g.
--option auto-optimise-store false
becomes
--no-auto-optimise-store
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/config.cc | 25 | ||||
-rw-r--r-- | src/libutil/config.hh | 6 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/libutil/config.cc b/src/libutil/config.cc index f7a46bfee..612fb6e68 100644 --- a/src/libutil/config.cc +++ b/src/libutil/config.cc @@ -115,6 +115,13 @@ void Config::toJSON(JSONObject & out) } } +void Config::convertToArgs(Args & args) +{ + for (auto & s : _settings) + if (!s.second.isAlias) + s.second.setting->convertToArg(args); +} + AbstractSetting::AbstractSetting( const std::string & name, const std::string & description, @@ -128,12 +135,22 @@ void AbstractSetting::toJSON(JSONPlaceholder & out) out.write(to_string()); } +void AbstractSetting::convertToArg(Args & args) +{ +} + template<typename T> void BaseSetting<T>::toJSON(JSONPlaceholder & out) { out.write(value); } +template<typename T> +void BaseSetting<T>::convertToArg(Args & args) +{ + args.mkFlag(0, name, {}, description, 1, [=](Strings ss) { set(*ss.begin()); }); +} + template<> void BaseSetting<std::string>::set(const std::string & str) { value = str; @@ -174,6 +191,12 @@ template<> std::string BaseSetting<bool>::to_string() return value ? "true" : "false"; } +template<> void BaseSetting<bool>::convertToArg(Args & args) +{ + args.mkFlag(0, name, {}, description, 0, [=](Strings ss) { value = true; }); + args.mkFlag(0, "no-" + name, {}, description, 0, [=](Strings ss) { value = false; }); +} + template<> void BaseSetting<Strings>::set(const std::string & str) { value = tokenizeString<Strings>(str); @@ -216,6 +239,8 @@ template class BaseSetting<long long>; template class BaseSetting<unsigned long long>; template class BaseSetting<bool>; template class BaseSetting<std::string>; +template class BaseSetting<Strings>; +template class BaseSetting<StringSet>; void PathSetting::set(const std::string & str) { diff --git a/src/libutil/config.hh b/src/libutil/config.hh index 77620d47d..2ca643fe0 100644 --- a/src/libutil/config.hh +++ b/src/libutil/config.hh @@ -63,6 +63,8 @@ public: void resetOverriden(); void toJSON(JSONObject & out); + + void convertToArgs(Args & args); }; class AbstractSetting @@ -99,6 +101,8 @@ protected: virtual void toJSON(JSONPlaceholder & out); + virtual void convertToArg(Args & args); + bool isOverriden() { return overriden; } }; @@ -132,6 +136,8 @@ public: std::string to_string() override; + void convertToArg(Args & args) override; + void toJSON(JSONPlaceholder & out) override; }; |