forked from lix-project/lix
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
|
@ -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…
Reference in a new issue