update dependencies
Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
parent
c489e9e8ae
commit
6310335e41
21 changed files with 800 additions and 370 deletions
|
|
@ -20,7 +20,7 @@ auto get_primitive_type(IkarusValueDataPrimitive const & primitive)
|
|||
[](IkarusValueDataPrimitiveNumber const &) {
|
||||
return IkarusValuePrimitiveType_Number;
|
||||
},
|
||||
[](IkarusValueDataPrimitiveString const &) {
|
||||
[](IkarusValueDataPrimitiveText const &) {
|
||||
return IkarusValuePrimitiveType_Text;
|
||||
}
|
||||
},
|
||||
|
|
@ -36,7 +36,7 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
|
||||
IkarusValueData value{};
|
||||
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto type,
|
||||
deserialize_enum<IkarusValueDataType>(
|
||||
json,
|
||||
|
|
@ -48,7 +48,7 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
|
||||
switch (type) {
|
||||
case IkarusValueDataType_Primitive: {
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto primitive,
|
||||
deserialize_enum<IkarusValuePrimitiveType>(
|
||||
json,
|
||||
|
|
@ -60,21 +60,21 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
|
||||
switch (primitive) {
|
||||
case IkarusValuePrimitiveType_Toggle: {
|
||||
VTRY(auto data, deserialize_any<bool>(json, "data"));
|
||||
CPPBASE_VTRY(auto data, deserialize_any<bool>(json, "data"));
|
||||
|
||||
value.variant = IkarusValueDataPrimitiveToggle{data};
|
||||
break;
|
||||
}
|
||||
case IkarusValuePrimitiveType_Number: {
|
||||
VTRY(auto data, deserialize_any<double>(json, "data"));
|
||||
CPPBASE_VTRY(auto data, deserialize_any<double>(json, "data"));
|
||||
|
||||
value.variant = IkarusValueDataPrimitiveNumber{data};
|
||||
break;
|
||||
}
|
||||
case IkarusValuePrimitiveType_Text: {
|
||||
VTRY(auto data, deserialize_any<std::string>(json, "data"));
|
||||
CPPBASE_VTRY(auto data, deserialize_any<std::string>(json, "data"));
|
||||
|
||||
value.variant = IkarusValueDataPrimitiveString{data};
|
||||
value.variant = IkarusValueDataPrimitiveText{data};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -83,14 +83,17 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
}
|
||||
case IkarusValueDataType_List: {
|
||||
std::vector<cppbase::owning_ptr<IkarusValueData>> values_data{};
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto data_json,
|
||||
deserialize_any<std::vector<nlohmann::json>>(json, "data")
|
||||
);
|
||||
|
||||
values_data.reserve(data_json.size());
|
||||
for (auto const & data_json : data_json) {
|
||||
VTRY(auto value_data, IkarusValueData::from_json(data_json));
|
||||
CPPBASE_VTRY(
|
||||
auto value_data,
|
||||
IkarusValueData::from_json(data_json)
|
||||
);
|
||||
values_data.emplace_back(
|
||||
cppbase::make_owning<IkarusValueData>(std::move(value_data))
|
||||
);
|
||||
|
|
@ -105,7 +108,7 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
cppbase::owning_ptr<IkarusValueData>>>
|
||||
map_data{};
|
||||
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto map_data_json,
|
||||
deserialize_any<std::vector<nlohmann::json>>(json, "data")
|
||||
);
|
||||
|
|
@ -113,10 +116,10 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
map_data.reserve(map_data_json.size());
|
||||
|
||||
for (auto const & pair_json : map_data_json) {
|
||||
VTRY(auto key_json, get_key(pair_json, "key"));
|
||||
VTRY(auto value_json, get_key(pair_json, "value"));
|
||||
VTRY(auto key, IkarusValueData::from_json(*key_json));
|
||||
VTRY(auto value, IkarusValueData::from_json(*value_json));
|
||||
CPPBASE_VTRY(auto key_json, get_key(pair_json, "key"));
|
||||
CPPBASE_VTRY(auto value_json, get_key(pair_json, "value"));
|
||||
CPPBASE_VTRY(auto key, IkarusValueData::from_json(*key_json));
|
||||
CPPBASE_VTRY(auto value, IkarusValueData::from_json(*value_json));
|
||||
|
||||
map_data.emplace_back(
|
||||
cppbase::make_owning<IkarusValueData>(key),
|
||||
|
|
@ -130,7 +133,7 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
case IkarusValueDataType_Tuple: {
|
||||
std::vector<cppbase::owning_ptr<IkarusValueData>> values_data{};
|
||||
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto values_json,
|
||||
deserialize_any<std::vector<nlohmann::json>>(json, "data")
|
||||
);
|
||||
|
|
@ -138,7 +141,10 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
values_data.reserve(values_json.size());
|
||||
|
||||
for (auto const & value_json : values_json) {
|
||||
VTRY(auto value_data, IkarusValueData::from_json(value_json));
|
||||
CPPBASE_VTRY(
|
||||
auto value_data,
|
||||
IkarusValueData::from_json(value_json)
|
||||
);
|
||||
values_data.emplace_back(
|
||||
cppbase::make_owning<IkarusValueData>(value_data)
|
||||
);
|
||||
|
|
@ -152,6 +158,19 @@ auto IkarusValueData::from_json(nlohmann::json const & json)
|
|||
return cppbase::ok(value);
|
||||
}
|
||||
|
||||
auto IkarusValueData::from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValueData, IkarusValueDataParseError> {
|
||||
auto json = nlohmann::json::parse(json_str, nullptr, false);
|
||||
|
||||
if (json.is_discarded()) {
|
||||
return cppbase::err(
|
||||
IkarusValueDataParseError{IkarusJsonError{IkarusJsonParseError{}}}
|
||||
);
|
||||
}
|
||||
|
||||
return IkarusValueData::from_json(json);
|
||||
}
|
||||
|
||||
auto IkarusValueData::to_json(IkarusValueData const & value) -> nlohmann::json {
|
||||
nlohmann::json json = nlohmann::json::object();
|
||||
|
||||
|
|
@ -170,7 +189,7 @@ auto IkarusValueData::to_json(IkarusValueData const & value) -> nlohmann::json {
|
|||
json["primitive"] = IkarusValuePrimitiveType_Number;
|
||||
json["data"] = number.value;
|
||||
},
|
||||
[&](IkarusValueDataPrimitiveString const & string) {
|
||||
[&](IkarusValueDataPrimitiveText const & string) {
|
||||
json["type"] = IkarusValueDataType_Primitive;
|
||||
json["primitive"] = IkarusValuePrimitiveType_Text;
|
||||
json["data"] = string.value;
|
||||
|
|
|
|||
|
|
@ -22,14 +22,14 @@ struct IkarusValueDataPrimitiveNumber {
|
|||
double value;
|
||||
};
|
||||
|
||||
struct IkarusValueDataPrimitiveString {
|
||||
struct IkarusValueDataPrimitiveText {
|
||||
std::string value;
|
||||
};
|
||||
|
||||
using IkarusValueDataPrimitive = std::variant<
|
||||
IkarusValueDataPrimitiveToggle,
|
||||
IkarusValueDataPrimitiveNumber,
|
||||
IkarusValueDataPrimitiveString>;
|
||||
IkarusValueDataPrimitiveText>;
|
||||
|
||||
struct IkarusValueDataList {
|
||||
std::vector<cppbase::owning_ptr<IkarusValueData>> values;
|
||||
|
|
@ -53,7 +53,9 @@ struct IkarusValueData {
|
|||
IkarusValueDataMap,
|
||||
IkarusValueDataTuple>;
|
||||
|
||||
static auto from_json(nlohmann::json const & json)
|
||||
static auto from_json(nlohmann::json const & json_str)
|
||||
-> cppbase::Result<IkarusValueData, IkarusValueDataParseError>;
|
||||
static auto from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValueData, IkarusValueDataParseError>;
|
||||
static auto to_json(IkarusValueData const & value) -> nlohmann::json;
|
||||
|
||||
|
|
|
|||
|
|
@ -10,12 +10,15 @@ struct IkarusJsonInvalidTypeError {};
|
|||
|
||||
struct IkarusJsonEnumOutOfBoundsError {};
|
||||
|
||||
struct IkarusJsonParseError {};
|
||||
|
||||
struct IkarusJsonUnknownError {};
|
||||
|
||||
using IkarusJsonError = std::variant<
|
||||
IkarusJsonMissingKeyError,
|
||||
IkarusJsonInvalidTypeError,
|
||||
IkarusJsonEnumOutOfBoundsError,
|
||||
IkarusJsonParseError,
|
||||
IkarusJsonUnknownError>;
|
||||
|
||||
struct IkarusValueSchemaParseError {
|
||||
|
|
@ -57,6 +60,16 @@ struct fmt::formatter<IkarusJsonInvalidTypeError> : formatter<string_view> {
|
|||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct fmt::formatter<IkarusJsonParseError> : formatter<string_view> {
|
||||
constexpr static auto format(
|
||||
[[maybe_unused]] IkarusJsonParseError const & error,
|
||||
fmt::format_context & ctx
|
||||
) {
|
||||
return fmt::format_to(ctx.out(), "buffer isn't valid JSON");
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct fmt::formatter<IkarusJsonEnumOutOfBoundsError> : formatter<string_view> {
|
||||
constexpr static auto format(
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <ikarus/values/data.hpp>
|
||||
#include <ikarus/values/schema.h>
|
||||
#include <ikarus/values/shared.hpp>
|
||||
#include <ikarus/values/value.hpp>
|
||||
|
||||
auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
||||
-> cppbase::Result<IkarusValueSchema, IkarusValueSchemaParseError> {
|
||||
|
|
@ -18,7 +19,7 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
|
||||
IkarusValueSchema schema{};
|
||||
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto type,
|
||||
deserialize_enum<IkarusValueSchemaType>(
|
||||
json,
|
||||
|
|
@ -30,7 +31,7 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
|
||||
switch (type) {
|
||||
case IkarusValueSchemaType_Primitive: {
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto primitive,
|
||||
deserialize_enum<IkarusValuePrimitiveType>(
|
||||
json,
|
||||
|
|
@ -43,15 +44,21 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
break;
|
||||
}
|
||||
case IkarusValueSchemaType_List: {
|
||||
VTRY(auto sub_schema, IkarusValueSchema::from_json(json["schema"]));
|
||||
CPPBASE_VTRY(
|
||||
auto sub_schema,
|
||||
IkarusValueSchema::from_json(json["schema"])
|
||||
);
|
||||
schema.variant = IkarusValueSchemaList{
|
||||
cppbase::make_owning<IkarusValueSchema>(std::move(sub_schema))
|
||||
};
|
||||
break;
|
||||
}
|
||||
case IkarusValueSchemaType_Map: {
|
||||
VTRY(auto key_schema, IkarusValueSchema::from_json(json["key_schema"]));
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto key_schema,
|
||||
IkarusValueSchema::from_json(json["key_schema"])
|
||||
);
|
||||
CPPBASE_VTRY(
|
||||
auto value_schema,
|
||||
IkarusValueSchema::from_json(json["value_schema"])
|
||||
);
|
||||
|
|
@ -62,7 +69,7 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
break;
|
||||
}
|
||||
case IkarusValueSchemaType_Tuple: {
|
||||
VTRY(
|
||||
CPPBASE_VTRY(
|
||||
auto sub_schemas_json,
|
||||
deserialize_any<std::vector<nlohmann::json>>(json, "schemas")
|
||||
);
|
||||
|
|
@ -71,7 +78,10 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
sub_schemas.reserve(sub_schemas_json.size());
|
||||
|
||||
for (auto const & sub_schema_json : sub_schemas_json) {
|
||||
VTRY(auto schema, IkarusValueSchema::from_json(sub_schema_json));
|
||||
CPPBASE_VTRY(
|
||||
auto schema,
|
||||
IkarusValueSchema::from_json(sub_schema_json)
|
||||
);
|
||||
sub_schemas.emplace_back(
|
||||
cppbase::make_owning<IkarusValueSchema>(std::move(schema))
|
||||
);
|
||||
|
|
@ -85,6 +95,19 @@ auto IkarusValueSchema::from_json(nlohmann::json const & json)
|
|||
return cppbase::ok(std::move(schema));
|
||||
}
|
||||
|
||||
auto IkarusValueSchema::from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValueSchema, IkarusValueSchemaParseError> {
|
||||
auto json = nlohmann::json::parse(json_str, nullptr, false);
|
||||
|
||||
if (json.is_discarded()) {
|
||||
return cppbase::err(
|
||||
IkarusValueSchemaParseError{IkarusJsonError{IkarusJsonParseError{}}}
|
||||
);
|
||||
}
|
||||
|
||||
return IkarusValueSchema::from_json(json);
|
||||
}
|
||||
|
||||
auto IkarusValueSchema::to_json(IkarusValueSchema const & schema)
|
||||
-> nlohmann::json {
|
||||
nlohmann::json json = nlohmann::json::object();
|
||||
|
|
@ -173,3 +196,46 @@ auto IkarusValueSchema::validate(IkarusValueData const & data) const -> bool {
|
|||
data.variant
|
||||
);
|
||||
}
|
||||
|
||||
auto IkarusValueSchema::default_value_data() const -> IkarusValueData {
|
||||
return std::visit(
|
||||
cppbase::overloaded{
|
||||
[](IkarusValueSchemaPrimitive const & schema) -> IkarusValueData {
|
||||
switch (schema.type) {
|
||||
case IkarusValuePrimitiveType_Toggle: {
|
||||
return {{IkarusValueDataPrimitiveToggle{false}}};
|
||||
}
|
||||
case IkarusValuePrimitiveType_Number:
|
||||
return {{IkarusValueDataPrimitiveNumber{0.0}}};
|
||||
case IkarusValuePrimitiveType_Text:
|
||||
return {{IkarusValueDataPrimitiveText{""}}};
|
||||
}
|
||||
},
|
||||
[](IkarusValueSchemaList const & schema) -> IkarusValueData {
|
||||
return {IkarusValueDataList{{}}};
|
||||
},
|
||||
[](IkarusValueSchemaMap const & schema) -> IkarusValueData {
|
||||
return {IkarusValueDataMap{{}}};
|
||||
},
|
||||
[](IkarusValueSchemaTuple const & schema) -> IkarusValueData {
|
||||
IkarusValueDataTuple data{};
|
||||
data.values.reserve(schema.sub_schemas.size());
|
||||
|
||||
for (auto const & sub_schema : schema.sub_schemas) {
|
||||
data.values.emplace_back(
|
||||
cppbase::make_owning<IkarusValueData>(
|
||||
sub_schema->default_value().data
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return {data};
|
||||
}
|
||||
},
|
||||
variant
|
||||
);
|
||||
}
|
||||
|
||||
auto IkarusValueSchema::default_value() const -> IkarusValue {
|
||||
return IkarusValue{*this, default_value_data()};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,9 +42,13 @@ struct IkarusValueSchema {
|
|||
|
||||
static auto from_json(nlohmann::json const & json)
|
||||
-> cppbase::Result<IkarusValueSchema, IkarusValueSchemaParseError>;
|
||||
static auto from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValueSchema, IkarusValueSchemaParseError>;
|
||||
static auto to_json(IkarusValueSchema const & value) -> nlohmann::json;
|
||||
|
||||
auto validate(IkarusValueData const & data) const -> bool;
|
||||
auto default_value_data() const -> IkarusValueData;
|
||||
auto default_value() const -> IkarusValue;
|
||||
|
||||
IkarusValueSchemaVariant variant;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ auto deserialize_enum(
|
|||
E min,
|
||||
E max
|
||||
) -> cppbase::Result<E, IkarusJsonError> {
|
||||
VTRY(auto iter, get_key(json, key));
|
||||
CPPBASE_VTRY(auto iter, get_key(json, key));
|
||||
|
||||
if (!iter->is_number_integer()) {
|
||||
return cppbase::err(IkarusJsonError{});
|
||||
|
|
@ -51,7 +51,7 @@ auto deserialize_enum(
|
|||
template<typename T>
|
||||
auto deserialize_any(nlohmann::json const & json, std::string_view key)
|
||||
-> cppbase::Result<T, IkarusJsonError> {
|
||||
VTRY(auto iter, get_key(json, key));
|
||||
CPPBASE_VTRY(auto iter, get_key(json, key));
|
||||
|
||||
try {
|
||||
return cppbase::ok(iter->get<T>());
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ auto IkarusValue::from_json(nlohmann::json const & json)
|
|||
|
||||
IkarusValue value{};
|
||||
|
||||
VTRY(value.schema, IkarusValueSchema::from_json(json["schema"]));
|
||||
VTRY(value.data, IkarusValueData::from_json(json["data"]));
|
||||
CPPBASE_VTRY(value.schema, IkarusValueSchema::from_json(json["schema"]));
|
||||
CPPBASE_VTRY(value.data, IkarusValueData::from_json(json["data"]));
|
||||
|
||||
if (!value.schema.validate(value.data)) {
|
||||
return cppbase::err(IkarusValueParseErrorDataSchemaMismatch{});
|
||||
|
|
@ -25,6 +25,19 @@ auto IkarusValue::from_json(nlohmann::json const & json)
|
|||
return cppbase::ok(std::move(value));
|
||||
}
|
||||
|
||||
auto IkarusValue::from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValue, IkarusValueParseError> {
|
||||
auto json = nlohmann::json::parse(json_str, nullptr, false);
|
||||
|
||||
if (json.is_discarded()) {
|
||||
return cppbase::err(
|
||||
IkarusValueDataParseError{IkarusJsonError{IkarusJsonParseError{}}}
|
||||
);
|
||||
}
|
||||
|
||||
return IkarusValue::from_json(json);
|
||||
}
|
||||
|
||||
auto IkarusValue::to_json(IkarusValue const & value) -> nlohmann::json {
|
||||
nlohmann::json json = nlohmann::json::object();
|
||||
|
||||
|
|
|
|||
|
|
@ -14,5 +14,7 @@ struct IkarusValue {
|
|||
|
||||
static auto from_json(nlohmann::json const & json)
|
||||
-> cppbase::Result<IkarusValue, IkarusValueParseError>;
|
||||
static auto from_json_str(std::string_view json_str)
|
||||
-> cppbase::Result<IkarusValue, IkarusValueParseError>;
|
||||
static auto to_json(IkarusValue const & value) -> nlohmann::json;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue