Improve nix show-config --json

In particular, show descriptions. This could be used for manpage
generation etc.
This commit is contained in:
Eelco Dolstra 2017-04-20 17:34:47 +02:00
parent 4410e9d995
commit efa4bdbfcd
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
6 changed files with 71 additions and 43 deletions

View file

@ -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());

View file

@ -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)
{ {

View file

@ -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>

View file

@ -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))
{ {

View file

@ -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
{ {

View file

@ -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";