foxygit / Torlinkc Log in
commits tags

/src/config/config.cpp · 1.26 KB

raw
#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