Config: Use nlohmann/json

This commit is contained in:
Eelco Dolstra 2020-08-20 11:02:16 +02:00
parent b4ef3d7078
commit acb99f03f9
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 37 additions and 32 deletions

View file

@ -56,3 +56,5 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
#include <nlohmann/json.hpp>

View file

@ -9,6 +9,8 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#include <nlohmann/json.hpp>
namespace nix { namespace nix {
@ -160,9 +162,9 @@ template<> std::string BaseSetting<SandboxMode>::to_string() const
else abort(); else abort();
} }
template<> void BaseSetting<SandboxMode>::toJSON(JSONPlaceholder & out) template<> nlohmann::json BaseSetting<SandboxMode>::toJSON()
{ {
AbstractSetting::toJSON(out); return AbstractSetting::toJSON();
} }
template<> void BaseSetting<SandboxMode>::convertToArg(Args & args, const std::string & category) template<> void BaseSetting<SandboxMode>::convertToArg(Args & args, const std::string & category)

View file

@ -1,6 +1,7 @@
#include "config.hh" #include "config.hh"
#include "args.hh" #include "args.hh"
#include "json.hh"
#include <nlohmann/json.hpp>
namespace nix { namespace nix {
@ -131,15 +132,17 @@ void Config::resetOverriden()
s.second.setting->overriden = false; s.second.setting->overriden = false;
} }
void Config::toJSON(JSONObject & out) nlohmann::json Config::toJSON()
{ {
auto res = nlohmann::json::object();
for (auto & s : _settings) for (auto & s : _settings)
if (!s.second.isAlias) { if (!s.second.isAlias) {
JSONObject out2(out.object(s.first)); auto obj = nlohmann::json::object();
out2.attr("description", s.second.setting->description); obj.emplace("description", s.second.setting->description);
JSONPlaceholder out3(out2.placeholder("value")); obj.emplace("value", s.second.setting->toJSON());
s.second.setting->toJSON(out3); res.emplace(s.first, obj);
} }
return res;
} }
void Config::convertToArgs(Args & args, const std::string & category) void Config::convertToArgs(Args & args, const std::string & category)
@ -199,9 +202,9 @@ void AbstractSetting::setDefault(const std::string & str)
if (!overriden) set(str); if (!overriden) set(str);
} }
void AbstractSetting::toJSON(JSONPlaceholder & out) nlohmann::json AbstractSetting::toJSON()
{ {
out.write(to_string()); return to_string();
} }
void AbstractSetting::convertToArg(Args & args, const std::string & category) void AbstractSetting::convertToArg(Args & args, const std::string & category)
@ -209,9 +212,9 @@ void AbstractSetting::convertToArg(Args & args, const std::string & category)
} }
template<typename T> template<typename T>
void BaseSetting<T>::toJSON(JSONPlaceholder & out) nlohmann::json BaseSetting<T>::toJSON()
{ {
out.write(value); return value;
} }
template<typename T> template<typename T>
@ -292,11 +295,9 @@ template<> std::string BaseSetting<Strings>::to_string() const
return concatStringsSep(" ", value); return concatStringsSep(" ", value);
} }
template<> void BaseSetting<Strings>::toJSON(JSONPlaceholder & out) template<> nlohmann::json BaseSetting<Strings>::toJSON()
{ {
JSONList list(out.list()); return value;
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)
@ -309,11 +310,9 @@ template<> std::string BaseSetting<StringSet>::to_string() const
return concatStringsSep(" ", value); return concatStringsSep(" ", value);
} }
template<> void BaseSetting<StringSet>::toJSON(JSONPlaceholder & out) template<> nlohmann::json BaseSetting<StringSet>::toJSON()
{ {
JSONList list(out.list()); return value;
for (auto & s : value)
list.elem(s);
} }
template class BaseSetting<int>; template class BaseSetting<int>;
@ -360,10 +359,12 @@ void GlobalConfig::resetOverriden()
config->resetOverriden(); config->resetOverriden();
} }
void GlobalConfig::toJSON(JSONObject & out) nlohmann::json GlobalConfig::toJSON()
{ {
auto res = nlohmann::json::object();
for (auto & config : *configRegistrations) for (auto & config : *configRegistrations)
config->toJSON(out); res.update(config->toJSON());
return res;
} }
void GlobalConfig::convertToArgs(Args & args, const std::string & category) void GlobalConfig::convertToArgs(Args & args, const std::string & category)

View file

@ -4,6 +4,8 @@
#include "types.hh" #include "types.hh"
#include <nlohmann/json_fwd.hpp>
#pragma once #pragma once
namespace nix { namespace nix {
@ -42,8 +44,6 @@ namespace nix {
class Args; class Args;
class AbstractSetting; class AbstractSetting;
class JSONPlaceholder;
class JSONObject;
class AbstractConfig class AbstractConfig
{ {
@ -97,7 +97,7 @@ public:
* Outputs all settings to JSON * Outputs all settings to JSON
* - out: JSONObject to write the configuration to * - out: JSONObject to write the configuration to
*/ */
virtual void toJSON(JSONObject & out) = 0; virtual nlohmann::json toJSON() = 0;
/** /**
* Converts settings to `Args` to be used on the command line interface * Converts settings to `Args` to be used on the command line interface
@ -167,7 +167,7 @@ public:
void resetOverriden() override; void resetOverriden() override;
void toJSON(JSONObject & out) override; nlohmann::json toJSON() override;
void convertToArgs(Args & args, const std::string & category) override; void convertToArgs(Args & args, const std::string & category) override;
}; };
@ -206,7 +206,7 @@ protected:
virtual std::string to_string() const = 0; virtual std::string to_string() const = 0;
virtual void toJSON(JSONPlaceholder & out); virtual nlohmann::json toJSON();
virtual void convertToArg(Args & args, const std::string & category); virtual void convertToArg(Args & args, const std::string & category);
@ -251,7 +251,7 @@ public:
void convertToArg(Args & args, const std::string & category) override; void convertToArg(Args & args, const std::string & category) override;
void toJSON(JSONPlaceholder & out) override; nlohmann::json toJSON() override;
}; };
template<typename T> template<typename T>
@ -319,7 +319,7 @@ struct GlobalConfig : public AbstractConfig
void resetOverriden() override; void resetOverriden() override;
void toJSON(JSONObject & out) override; nlohmann::json toJSON() override;
void convertToArgs(Args & args, const std::string & category) override; void convertToArgs(Args & args, const std::string & category) override;

View file

@ -2,7 +2,8 @@
#include "common-args.hh" #include "common-args.hh"
#include "shared.hh" #include "shared.hh"
#include "store-api.hh" #include "store-api.hh"
#include "json.hh"
#include <nlohmann/json.hpp>
using namespace nix; using namespace nix;
@ -19,8 +20,7 @@ struct CmdShowConfig : Command, MixJSON
{ {
if (json) { if (json) {
// FIXME: use appropriate JSON types (bool, ints, etc). // FIXME: use appropriate JSON types (bool, ints, etc).
JSONObject jsonObj(std::cout); logger->stdout("%s", globalConfig.toJSON().dump());
globalConfig.toJSON(jsonObj);
} else { } else {
std::map<std::string, Config::SettingInfo> settings; std::map<std::string, Config::SettingInfo> settings;
globalConfig.getSettings(settings); globalConfig.getSettings(settings);