Add json object parsing and helpers
This commit is contained in:
@@ -111,7 +111,7 @@ namespace Inferno {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if property is array
|
// Check if property is array []
|
||||||
ASSERT(getValue(it).is_array(), "Json property is not an array '{}'", property);
|
ASSERT(getValue(it).is_array(), "Json property is not an array '{}'", property);
|
||||||
|
|
||||||
// Fill array with values
|
// Fill array with values
|
||||||
@@ -126,6 +126,45 @@ namespace Inferno {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return vector if it has any items, uninitialized optional otherwise
|
||||||
|
return values.size() > 0 ? std::optional { values } : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static std::optional<std::map<std::string, T>> parseObjectProperty(const json& json, const char* property, bool required, json::value_t check)
|
||||||
|
{
|
||||||
|
return parseObjectProperty<T>(json, property, required, std::vector { check });
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static std::optional<std::map<std::string, T>> parseObjectProperty(const json& json, const char* property, bool required, std::vector<json::value_t> checks)
|
||||||
|
{
|
||||||
|
bool exists;
|
||||||
|
json_const_iterator it;
|
||||||
|
|
||||||
|
// Has property
|
||||||
|
exists = hasProperty(json, it, property);
|
||||||
|
ASSERT(!required || (required && exists), "Json could not find required property '{}'", property);
|
||||||
|
|
||||||
|
if (!exists) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if property is an object {}
|
||||||
|
ASSERT(getValue(it).is_object(), "Json property is not an array '{}'", property);
|
||||||
|
|
||||||
|
std::map<std::string, T> values;
|
||||||
|
for (auto& [key, value] : getValue(it).items()) {
|
||||||
|
auto typedValue = getPropertyValue<T>(value, checks);
|
||||||
|
if (typedValue) {
|
||||||
|
values.emplace(std::move(key), typedValue.value());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
warnln("Json array property '{}' has type inconsistency", property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return map if it has any items, uninitialized optional otherwise
|
||||||
return values.size() > 0 ? std::optional { values } : std::nullopt;
|
return values.size() > 0 ? std::optional { values } : std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,8 +208,33 @@ namespace Inferno {
|
|||||||
return parseArrayProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
return parseArrayProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::optional<std::map<std::string, double>> parseDoubleObjectProperty(const json& json, const char* property, bool required)
|
||||||
|
{
|
||||||
|
return parseObjectProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::optional<std::map<std::string, int32_t>> parseIntegerObjectProperty(const json& json, const char* property, bool required)
|
||||||
|
{
|
||||||
|
return parseObjectProperty<int32_t>(json, property, required, json::value_t::number_integer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::optional<std::map<std::string, uint32_t>> parseUnsignedObjectProperty(const json& json, const char* property, bool required)
|
||||||
|
{
|
||||||
|
return parseObjectProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Inferno
|
} // namespace Inferno
|
||||||
|
|
||||||
#endif // JSON_UTIL_H
|
#endif // JSON_UTIL_H
|
||||||
|
|
||||||
|
// JSON syntax:
|
||||||
|
// [ ] = std::map, array (ordered)
|
||||||
|
// { } = std::vector, object (unordered)
|
||||||
|
// "": = std::string, property (key -> value)
|
||||||
|
// true/false = bool, condition
|
||||||
|
// -3 = int64_t, number
|
||||||
|
// 5 = uint64_t, number
|
||||||
|
// 4.567 = double, number
|
||||||
|
// "thing" = std::string, text
|
||||||
|
|||||||
Reference in New Issue
Block a user