59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
#include <stdexcept>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
#include "hex.h"
|
|
#include "file.h"
|
|
#include "config.h"
|
|
|
|
Config config;
|
|
|
|
void load_config(const char* path) {
|
|
File config_file(path, "r");
|
|
config = nlohmann::json::parse(config_file.get());
|
|
}
|
|
|
|
RedisConfig get_redis_config(const nlohmann::json& j) {
|
|
using namespace std::string_literals;
|
|
|
|
RedisConfig redis_config;
|
|
const nlohmann::json& connection = j.at("connection");
|
|
const std::string& connection_type = connection.at("type").get_ref<const std::string&>();
|
|
if (connection_type == "ip") {
|
|
redis_config.connection_method = IPConnection{
|
|
connection.at("address").get<std::string>(),
|
|
connection.at("port").get<int>()
|
|
};
|
|
} else if (connection_type == "unix") {
|
|
redis_config.connection_method = UnixConnection{connection.at("unix").get<std::string>()};
|
|
} else {
|
|
throw std::invalid_argument("Unknown redis connection type: "s + connection_type);
|
|
}
|
|
|
|
if (j.at("username").is_string()) {
|
|
redis_config.username = j["username"].get<std::string>();
|
|
}
|
|
if (j.at("password").is_string()) {
|
|
redis_config.password = j["password"].get<std::string>();
|
|
}
|
|
|
|
return redis_config;
|
|
}
|
|
|
|
void from_json(const nlohmann::json& j, Config& conf) {
|
|
using namespace std::string_literals;
|
|
|
|
j.at("bind_host").get_to(conf.bind_host);
|
|
j.at("bind_port").get_to(conf.bind_port);
|
|
if (conf.bind_port < 0) {
|
|
throw std::invalid_argument("Invalid port to bind to: "s + std::to_string(conf.bind_port));
|
|
}
|
|
|
|
conf.hmac_key = hex_decode(j.at("hmac_key").get_ref<const std::string&>());
|
|
if (j.at("canonical_origin").is_string()) {
|
|
conf.canonical_origin = j["canonical_origin"].get<std::string>();
|
|
}
|
|
if (j.at("redis").at("enabled").get<bool>()) {
|
|
conf.redis_config = get_redis_config(j["redis"]);
|
|
}
|
|
}
|