about summary refs log tree commit diff
path: root/src/libutil/config.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-20T15·34+0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-20T15·34+0200
commitefa4bdbfcd1489527bcf6f20a49c9a3bca8bbf6b (patch)
tree0e965a2b8feb129623c221564e7ca208ce16fe2a /src/libutil/config.cc
parent4410e9d995bcd53a7a4cff0bbee3917375adcba3 (diff)
Improve nix show-config --json
In particular, show descriptions. This could be used for manpage
generation etc.
Diffstat (limited to 'src/libutil/config.cc')
-rw-r--r--src/libutil/config.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libutil/config.cc b/src/libutil/config.cc
index 72b6cf8068..62c6433c74 100644
--- a/src/libutil/config.cc
+++ b/src/libutil/config.cc
@@ -1,5 +1,6 @@
 #include "config.hh"
 #include "args.hh"
+#include "json.hh"
 
 namespace nix {
 
@@ -103,6 +104,17 @@ void Config::resetOverriden()
         s.second.setting->overriden = false;
 }
 
+void Config::toJSON(JSONObject & out)
+{
+    for (auto & s : _settings)
+        if (!s.second.isAlias) {
+            JSONObject out2(out.object(s.first));
+            out2.attr("description", s.second.setting->description);
+            JSONPlaceholder out3(out2.placeholder("value"));
+            s.second.setting->toJSON(out3);
+        }
+}
+
 AbstractSetting::AbstractSetting(
     const std::string & name,
     const std::string & description,
@@ -111,6 +123,17 @@ AbstractSetting::AbstractSetting(
 {
 }
 
+void AbstractSetting::toJSON(JSONPlaceholder & out)
+{
+    out.write(to_string());
+}
+
+template<typename T>
+void BaseSetting<T>::toJSON(JSONPlaceholder & out)
+{
+    out.write(value);
+}
+
 template<> void BaseSetting<std::string>::set(const std::string & str)
 {
     value = str;
@@ -161,6 +184,13 @@ template<> std::string BaseSetting<Strings>::to_string()
     return concatStringsSep(" ", value);
 }
 
+template<> void BaseSetting<Strings>::toJSON(JSONPlaceholder & out)
+{
+    JSONList list(out.list());
+    for (auto & s : value)
+        list.elem(s);
+}
+
 template<> void BaseSetting<StringSet>::set(const std::string & str)
 {
     value = tokenizeString<StringSet>(str);
@@ -171,12 +201,20 @@ template<> std::string BaseSetting<StringSet>::to_string()
     return concatStringsSep(" ", value);
 }
 
+template<> void BaseSetting<StringSet>::toJSON(JSONPlaceholder & out)
+{
+    JSONList list(out.list());
+    for (auto & s : value)
+        list.elem(s);
+}
+
 template class BaseSetting<int>;
 template class BaseSetting<unsigned int>;
 template class BaseSetting<long>;
 template class BaseSetting<unsigned long>;
 template class BaseSetting<long long>;
 template class BaseSetting<unsigned long long>;
+template class BaseSetting<bool>;
 
 void PathSetting::set(const std::string & str)
 {