3#include <rapidjson/document.h>
4#include <rapidjson/istreamwrapper.h>
5#include <rapidjson/ostreamwrapper.h>
6#include <rapidjson/writer.h>
13 template <
typename T> std::string stringifyRapidjson(
const T &obj)
15 rapidjson::StringBuffer sbuffer;
16 rapidjson::Writer<rapidjson::StringBuffer> writer(sbuffer);
18 return sbuffer.GetString();
25 if (!inFile.is_open())
32 rapidjson::Document doc;
34 rapidjson::IStreamWrapper fStreamWrapper(inFile);
35 doc.ParseStream(fStreamWrapper);
39 if (doc.HasParseError())
41 _lastError = std::format(
"{} {}",
"JSON parse error at offset", std::to_string(doc.GetErrorOffset()));
46 if (doc.IsNull() || !doc.IsObject())
48 _lastError =
"Config is empty or not a JSON object";
53 for (
const auto &entry : doc.GetObject())
56 entry.value.IsString() ? entry.value.GetString() : stringifyRapidjson(entry.value);
65 rapidjson::OStreamWrapper fStreamWrapper(outFile);
67 rapidjson::Document doc;
70 for (
const auto &[keyVal, valueVal] :
_configMap)
72 rapidjson::Value key(keyVal.c_str(), doc.GetAllocator());
73 rapidjson::Value value(valueVal.c_str(), doc.GetAllocator());
74 doc.AddMember(key, value, doc.GetAllocator());
77 rapidjson::Writer<rapidjson::OStreamWrapper> writer(fStreamWrapper);
86 return itr ==
_configMap.end() ?
"" : itr->second;
std::unordered_map< std::string, std::string > _configMap
void set(const std::string &key, const std::string_view &value)
std::string get(const std::string &key) const
void remove(const std::string &key)
ConfigParser(std::filesystem::path configPath)
std::filesystem::path _configPath