commits
tags
#include "torlinkc/config/config.hpp"
#include <fstream>
#include <sstream>
#include <nlohmann/json.hpp>
#include "torlinkc/config/paths.hpp"
#include "torlinkc/util/atomic_write.hpp"
namespace torlinkc {
Config defaultConfig() { return Config{paths::defaultDownloadDir(), {}}; }
Config loadConfig() {
std::ifstream in(paths::configFile(), std::ios::binary);
if (!in) return defaultConfig();
std::ostringstream ss;
ss << in.rdbuf();
nlohmann::json parsed;
try {
parsed = nlohmann::json::parse(ss.str());
} catch (const nlohmann::json::parse_error&) {
return defaultConfig();
}
Config cfg = defaultConfig();
if (auto it = parsed.find("downloadDir");
it != parsed.end() && it->is_string() && !it->get<std::string>().empty()) {
cfg.downloadDir = it->get<std::string>();
}
cfg.trackers.clear();
if (auto it = parsed.find("trackers"); it != parsed.end() && it->is_array()) {
for (const auto& t : *it) {
if (t.is_string() && !t.get<std::string>().empty()) cfg.trackers.push_back(t.get<std::string>());
}
}
return cfg;
}
void saveConfig(const Config& config) {
nlohmann::json j;
j["downloadDir"] = config.downloadDir;
j["trackers"] = config.trackers;
writeJsonAtomic(paths::configFile(), j);
}
} // namespace torlinkc