Skip to content

Commit

Permalink
Config: Use nlohmann/json
Browse files Browse the repository at this point in the history
  • Loading branch information
edolstra committed Aug 20, 2020
1 parent b4ef3d7 commit acb99f0
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 32 deletions.
2 changes: 2 additions & 0 deletions precompiled-headers.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,5 @@
#include <sys/wait.h>
#include <termios.h>
#include <unistd.h>

#include <nlohmann/json.hpp>
6 changes: 4 additions & 2 deletions src/libstore/globals.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include <dlfcn.h>
#include <sys/utsname.h>

#include <nlohmann/json.hpp>


namespace nix {

Expand Down Expand Up @@ -160,9 +162,9 @@ template<> std::string BaseSetting<SandboxMode>::to_string() const
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)
Expand Down
41 changes: 21 additions & 20 deletions src/libutil/config.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "config.hh"
#include "args.hh"
#include "json.hh"

#include <nlohmann/json.hpp>

namespace nix {

Expand Down Expand Up @@ -131,15 +132,17 @@ void Config::resetOverriden()
s.second.setting->overriden = false;
}

void Config::toJSON(JSONObject & out)
nlohmann::json Config::toJSON()
{
auto res = nlohmann::json::object();
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);
auto obj = nlohmann::json::object();
obj.emplace("description", s.second.setting->description);
obj.emplace("value", s.second.setting->toJSON());
res.emplace(s.first, obj);
}
return res;
}

void Config::convertToArgs(Args & args, const std::string & category)
Expand Down Expand Up @@ -199,19 +202,19 @@ void AbstractSetting::setDefault(const std::string & 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)
{
}

template<typename T>
void BaseSetting<T>::toJSON(JSONPlaceholder & out)
nlohmann::json BaseSetting<T>::toJSON()
{
out.write(value);
return value;
}

template<typename T>
Expand Down Expand Up @@ -292,11 +295,9 @@ template<> std::string BaseSetting<Strings>::to_string() const
return concatStringsSep(" ", value);
}

template<> void BaseSetting<Strings>::toJSON(JSONPlaceholder & out)
template<> nlohmann::json BaseSetting<Strings>::toJSON()
{
JSONList list(out.list());
for (auto & s : value)
list.elem(s);
return value;
}

template<> void BaseSetting<StringSet>::set(const std::string & str)
Expand All @@ -309,11 +310,9 @@ template<> std::string BaseSetting<StringSet>::to_string() const
return concatStringsSep(" ", value);
}

template<> void BaseSetting<StringSet>::toJSON(JSONPlaceholder & out)
template<> nlohmann::json BaseSetting<StringSet>::toJSON()
{
JSONList list(out.list());
for (auto & s : value)
list.elem(s);
return value;
}

template class BaseSetting<int>;
Expand Down Expand Up @@ -360,10 +359,12 @@ void GlobalConfig::resetOverriden()
config->resetOverriden();
}

void GlobalConfig::toJSON(JSONObject & out)
nlohmann::json GlobalConfig::toJSON()
{
auto res = nlohmann::json::object();
for (auto & config : *configRegistrations)
config->toJSON(out);
res.update(config->toJSON());
return res;
}

void GlobalConfig::convertToArgs(Args & args, const std::string & category)
Expand Down
14 changes: 7 additions & 7 deletions src/libutil/config.hh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "types.hh"

#include <nlohmann/json_fwd.hpp>

#pragma once

namespace nix {
Expand Down Expand Up @@ -42,8 +44,6 @@ namespace nix {

class Args;
class AbstractSetting;
class JSONPlaceholder;
class JSONObject;

class AbstractConfig
{
Expand Down Expand Up @@ -97,7 +97,7 @@ public:
* Outputs all settings to JSON
* - 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
Expand Down Expand Up @@ -167,7 +167,7 @@ public:

void resetOverriden() override;

void toJSON(JSONObject & out) override;
nlohmann::json toJSON() override;

void convertToArgs(Args & args, const std::string & category) override;
};
Expand Down Expand Up @@ -206,7 +206,7 @@ protected:

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

Expand Down Expand Up @@ -251,7 +251,7 @@ public:

void convertToArg(Args & args, const std::string & category) override;

void toJSON(JSONPlaceholder & out) override;
nlohmann::json toJSON() override;
};

template<typename T>
Expand Down Expand Up @@ -319,7 +319,7 @@ struct GlobalConfig : public AbstractConfig

void resetOverriden() override;

void toJSON(JSONObject & out) override;
nlohmann::json toJSON() override;

void convertToArgs(Args & args, const std::string & category) override;

Expand Down
6 changes: 3 additions & 3 deletions src/nix/show-config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
#include "common-args.hh"
#include "shared.hh"
#include "store-api.hh"
#include "json.hh"

#include <nlohmann/json.hpp>

using namespace nix;

Expand All @@ -19,8 +20,7 @@ struct CmdShowConfig : Command, MixJSON
{
if (json) {
// FIXME: use appropriate JSON types (bool, ints, etc).
JSONObject jsonObj(std::cout);
globalConfig.toJSON(jsonObj);
logger->stdout("%s", globalConfig.toJSON().dump());
} else {
std::map<std::string, Config::SettingInfo> settings;
globalConfig.getSettings(settings);
Expand Down

0 comments on commit acb99f0

Please sign in to comment.