2021-03-13 16:10:39 -05:00
|
|
|
#pragma once
|
|
|
|
|
2023-05-21 17:24:23 -04:00
|
|
|
#include <optional>
|
2021-03-13 16:10:39 -05:00
|
|
|
#include <stdexcept>
|
2022-06-22 23:37:46 -04:00
|
|
|
|
2021-03-13 16:10:39 -05:00
|
|
|
#include "common/util/Range.h"
|
2022-06-22 23:37:46 -04:00
|
|
|
|
2021-03-13 16:10:39 -05:00
|
|
|
#include "third-party/json.hpp"
|
|
|
|
|
2023-05-18 20:54:59 -04:00
|
|
|
using json = nlohmann::json;
|
|
|
|
|
2021-03-13 16:10:39 -05:00
|
|
|
std::string strip_cpp_style_comments(const std::string& input);
|
2023-10-11 20:43:55 -04:00
|
|
|
std::optional<nlohmann::json> safe_parse_json(const std::string& input);
|
2021-05-11 21:57:05 -04:00
|
|
|
nlohmann::json parse_commented_json(const std::string& input, const std::string& source_name);
|
2021-03-13 16:10:39 -05:00
|
|
|
Range<int> parse_json_optional_integer_range(const nlohmann::json& json);
|
2023-05-18 20:54:59 -04:00
|
|
|
|
2023-05-21 17:24:23 -04:00
|
|
|
#define json_serialize(field_name) j[#field_name] = obj.field_name;
|
|
|
|
|
|
|
|
#define json_serialize_optional(field_name) \
|
|
|
|
if (obj.field_name) { \
|
|
|
|
j[#field_name] = obj.field_name.value(); \
|
|
|
|
}
|
|
|
|
|
2023-05-18 20:54:59 -04:00
|
|
|
#define json_deserialize_if_exists(field_name) \
|
|
|
|
if (j.contains(#field_name)) { \
|
|
|
|
j.at(#field_name).get_to(obj.field_name); \
|
|
|
|
}
|
2023-05-21 17:24:23 -04:00
|
|
|
|
|
|
|
template <typename T>
|
2024-07-26 09:42:28 -04:00
|
|
|
void json_get_optional(const nlohmann::json& j,
|
2023-05-21 17:24:23 -04:00
|
|
|
const std::string& key,
|
|
|
|
std::optional<T>& optionalValue) {
|
2024-07-26 09:42:28 -04:00
|
|
|
if (j.contains(key) && !j[key].is_null()) {
|
|
|
|
optionalValue = j[key].get<T>();
|
2023-05-21 17:24:23 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#define json_deserialize_optional_if_exists(field_name) \
|
|
|
|
if (j.contains(#field_name)) { \
|
|
|
|
json_get_optional(j, #field_name, obj.field_name); \
|
|
|
|
}
|