Improve nix show-config --json
In particular, show descriptions. This could be used for manpage generation etc.
This commit is contained in:
		
							parent
							
								
									4410e9d995
								
							
						
					
					
						commit
						efa4bdbfcd
					
				
					 6 changed files with 71 additions and 43 deletions
				
			
		|  | @ -89,6 +89,11 @@ template<> std::string BaseSetting<SandboxMode>::to_string() | ||||||
|     else abort(); |     else abort(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | template<> void BaseSetting<SandboxMode>::toJSON(JSONPlaceholder & out) | ||||||
|  | { | ||||||
|  |     AbstractSetting::toJSON(out); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void MaxBuildJobsSetting::set(const std::string & str) | void MaxBuildJobsSetting::set(const std::string & str) | ||||||
| { | { | ||||||
|     if (str == "auto") value = std::max(1U, std::thread::hardware_concurrency()); |     if (str == "auto") value = std::max(1U, std::thread::hardware_concurrency()); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include "config.hh" | #include "config.hh" | ||||||
| #include "args.hh" | #include "args.hh" | ||||||
|  | #include "json.hh" | ||||||
| 
 | 
 | ||||||
| namespace nix { | namespace nix { | ||||||
| 
 | 
 | ||||||
|  | @ -103,6 +104,17 @@ void Config::resetOverriden() | ||||||
|         s.second.setting->overriden = false; |         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( | AbstractSetting::AbstractSetting( | ||||||
|     const std::string & name, |     const std::string & name, | ||||||
|     const std::string & description, |     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) | template<> void BaseSetting<std::string>::set(const std::string & str) | ||||||
| { | { | ||||||
|     value = str; |     value = str; | ||||||
|  | @ -161,6 +184,13 @@ template<> std::string BaseSetting<Strings>::to_string() | ||||||
|     return concatStringsSep(" ", value); |     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) | template<> void BaseSetting<StringSet>::set(const std::string & str) | ||||||
| { | { | ||||||
|     value = tokenizeString<StringSet>(str); |     value = tokenizeString<StringSet>(str); | ||||||
|  | @ -171,12 +201,20 @@ template<> std::string BaseSetting<StringSet>::to_string() | ||||||
|     return concatStringsSep(" ", value); |     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<int>; | ||||||
| template class BaseSetting<unsigned int>; | template class BaseSetting<unsigned int>; | ||||||
| template class BaseSetting<long>; | template class BaseSetting<long>; | ||||||
| template class BaseSetting<unsigned long>; | template class BaseSetting<unsigned long>; | ||||||
| template class BaseSetting<long long>; | template class BaseSetting<long long>; | ||||||
| template class BaseSetting<unsigned long long>; | template class BaseSetting<unsigned long long>; | ||||||
|  | template class BaseSetting<bool>; | ||||||
| 
 | 
 | ||||||
| void PathSetting::set(const std::string & str) | void PathSetting::set(const std::string & str) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -9,6 +9,8 @@ namespace nix { | ||||||
| 
 | 
 | ||||||
| class Args; | class Args; | ||||||
| class AbstractSetting; | class AbstractSetting; | ||||||
|  | class JSONPlaceholder; | ||||||
|  | class JSONObject; | ||||||
| 
 | 
 | ||||||
| /* A class to simplify providing configuration settings. The typical
 | /* A class to simplify providing configuration settings. The typical
 | ||||||
|    use is to inherit Config and add Setting<T> members: |    use is to inherit Config and add Setting<T> members: | ||||||
|  | @ -56,6 +58,8 @@ public: | ||||||
|     void applyConfigFile(const Path & path, bool fatal = false); |     void applyConfigFile(const Path & path, bool fatal = false); | ||||||
| 
 | 
 | ||||||
|     void resetOverriden(); |     void resetOverriden(); | ||||||
|  | 
 | ||||||
|  |     void toJSON(JSONObject & out); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class AbstractSetting | class AbstractSetting | ||||||
|  | @ -90,6 +94,8 @@ protected: | ||||||
| 
 | 
 | ||||||
|     virtual std::string to_string() = 0; |     virtual std::string to_string() = 0; | ||||||
| 
 | 
 | ||||||
|  |     virtual void toJSON(JSONPlaceholder & out); | ||||||
|  | 
 | ||||||
|     bool isOverriden() { return overriden; } |     bool isOverriden() { return overriden; } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -122,6 +128,8 @@ public: | ||||||
|     void set(const std::string & str) override; |     void set(const std::string & str) override; | ||||||
| 
 | 
 | ||||||
|     std::string to_string() override; |     std::string to_string() override; | ||||||
|  | 
 | ||||||
|  |     void toJSON(JSONPlaceholder & out) override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template<typename T> | template<typename T> | ||||||
|  |  | ||||||
|  | @ -19,51 +19,34 @@ void toJSON(std::ostream & str, const char * start, const char * end) | ||||||
|     str << '"'; |     str << '"'; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void toJSON(std::ostream & str, const std::string & s) |  | ||||||
| { |  | ||||||
|     toJSON(str, s.c_str(), s.c_str() + s.size()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, const char * s) | void toJSON(std::ostream & str, const char * s) | ||||||
| { | { | ||||||
|     if (!s) str << "null"; else toJSON(str, s, s + strlen(s)); |     if (!s) str << "null"; else toJSON(str, s, s + strlen(s)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void toJSON(std::ostream & str, unsigned long long n) | template<> void toJSON<int>(std::ostream & str, const int & n) { str << n; } | ||||||
|  | template<> void toJSON<unsigned int>(std::ostream & str, const unsigned int & n) { str << n; } | ||||||
|  | template<> void toJSON<long>(std::ostream & str, const long & n) { str << n; } | ||||||
|  | template<> void toJSON<unsigned long>(std::ostream & str, const unsigned long & n) { str << n; } | ||||||
|  | template<> void toJSON<long long>(std::ostream & str, const long long & n) { str << n; } | ||||||
|  | template<> void toJSON<unsigned long long>(std::ostream & str, const unsigned long long & n) { str << n; } | ||||||
|  | template<> void toJSON<float>(std::ostream & str, const float & n) { str << n; } | ||||||
|  | 
 | ||||||
|  | template<> void toJSON<std::string>(std::ostream & str, const std::string & s) | ||||||
| { | { | ||||||
|     str << n; |     toJSON(str, s.c_str(), s.c_str() + s.size()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void toJSON(std::ostream & str, unsigned long n) | template<> void toJSON<bool>(std::ostream & str, const bool & b) | ||||||
| { |  | ||||||
|     str << n; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, long n) |  | ||||||
| { |  | ||||||
|     str << n; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, unsigned int n) |  | ||||||
| { |  | ||||||
|     str << n; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, int n) |  | ||||||
| { |  | ||||||
|     str << n; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, double f) |  | ||||||
| { |  | ||||||
|     str << f; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void toJSON(std::ostream & str, bool b) |  | ||||||
| { | { | ||||||
|     str << (b ? "true" : "false"); |     str << (b ? "true" : "false"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | template<> void toJSON<std::nullptr_t>(std::ostream & str, const std::nullptr_t & b) | ||||||
|  | { | ||||||
|  |     str << "null"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| JSONWriter::JSONWriter(std::ostream & str, bool indent) | JSONWriter::JSONWriter(std::ostream & str, bool indent) | ||||||
|     : state(new JSONState(str, indent)) |     : state(new JSONState(str, indent)) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -7,15 +7,10 @@ | ||||||
| namespace nix { | namespace nix { | ||||||
| 
 | 
 | ||||||
| void toJSON(std::ostream & str, const char * start, const char * end); | void toJSON(std::ostream & str, const char * start, const char * end); | ||||||
| void toJSON(std::ostream & str, const std::string & s); |  | ||||||
| void toJSON(std::ostream & str, const char * s); | void toJSON(std::ostream & str, const char * s); | ||||||
| void toJSON(std::ostream & str, unsigned long long n); | 
 | ||||||
| void toJSON(std::ostream & str, unsigned long n); | template<typename T> | ||||||
| void toJSON(std::ostream & str, long n); | void toJSON(std::ostream & str, const T & n); | ||||||
| void toJSON(std::ostream & str, unsigned int n); |  | ||||||
| void toJSON(std::ostream & str, int n); |  | ||||||
| void toJSON(std::ostream & str, double f); |  | ||||||
| void toJSON(std::ostream & str, bool b); |  | ||||||
| 
 | 
 | ||||||
| class JSONWriter | class JSONWriter | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -31,8 +31,7 @@ struct CmdShowConfig : Command | ||||||
|         if (json) { |         if (json) { | ||||||
|             // FIXME: use appropriate JSON types (bool, ints, etc).
 |             // FIXME: use appropriate JSON types (bool, ints, etc).
 | ||||||
|             JSONObject jsonObj(std::cout, true); |             JSONObject jsonObj(std::cout, true); | ||||||
|             for (auto & s : settings.getSettings()) |             settings.toJSON(jsonObj); | ||||||
|                 jsonObj.attr(s.first, s.second); |  | ||||||
|         } else { |         } else { | ||||||
|             for (auto & s : settings.getSettings()) |             for (auto & s : settings.getSettings()) | ||||||
|                 std::cout << s.first + " = " + s.second + "\n"; |                 std::cout << s.first + " = " + s.second + "\n"; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue