update dependencies

Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
folling 2025-01-02 09:39:58 +01:00 committed by Folling
parent c489e9e8ae
commit 6310335e41
Signed by: folling
SSH key fingerprint: SHA256:S9qEx5WCFFLK49tE/LKnKuJYM5sw+++Dn6qJbbyxnCY
21 changed files with 800 additions and 370 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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(

View file

@ -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()};
}

View file

@ -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;
};

View file

@ -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>());

View file

@ -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();

View file

@ -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;
};