Riyyi
4 years ago
1 changed files with 64 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||||||
|
#ifndef JSON_UTIL_H |
||||||
|
#define JSON_UTIL_H |
||||||
|
|
||||||
|
#include <optional> // std::optional |
||||||
|
|
||||||
|
#include "nlohmann/json.hpp" |
||||||
|
|
||||||
|
#include "inferno/assert.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
using json = nlohmann::json; |
||||||
|
using json_const_iterator = nlohmann::json::const_iterator; |
||||||
|
|
||||||
|
class Json { |
||||||
|
public: |
||||||
|
static const json& getValue(json_const_iterator& it) |
||||||
|
{ |
||||||
|
return it.value(); |
||||||
|
} |
||||||
|
|
||||||
|
template<typename T, typename C> |
||||||
|
static std::optional<T> getType(const json& json, C check) |
||||||
|
{ |
||||||
|
if (json.type() == check) { |
||||||
|
return json.get<T>(); |
||||||
|
} |
||||||
|
|
||||||
|
return {}; |
||||||
|
} |
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
|
||||||
|
static bool hasProperty(const json& json, json_const_iterator& it, const char* member) |
||||||
|
{ |
||||||
|
it = json.find(member); |
||||||
|
return it != json.end(); |
||||||
|
} |
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
|
||||||
|
template<typename T, typename C> |
||||||
|
static std::optional<T> parseProperty(const json& json, const char* property, bool required, C check) |
||||||
|
{ |
||||||
|
bool result; |
||||||
|
json_const_iterator it; |
||||||
|
|
||||||
|
// Has property
|
||||||
|
result = hasProperty(json, it, property); |
||||||
|
ASSERT(!required || (required && result), "Json could not find property '{}'", property); |
||||||
|
|
||||||
|
if (!result) { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
|
||||||
|
// Return data found in iterator, empty if incorrect type
|
||||||
|
return getType<T>(getValue(it), check); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace Inferno
|
||||||
|
|
||||||
|
|
||||||
|
#endif // JSON_UTIL_H
|
Loading…
Reference in new issue