diff --git a/include/rfl/json/schema/Type.hpp b/include/rfl/json/schema/Type.hpp index 0fc46d8d..2efddc2f 100644 --- a/include/rfl/json/schema/Type.hpp +++ b/include/rfl/json/schema/Type.hpp @@ -101,7 +101,7 @@ struct Type { rfl::Flatten annotations{}; rfl::Object properties{}; std::vector required{}; - std::shared_ptr additionalProperties{}; + rfl::Variant> additionalProperties{}; }; struct OneOf { diff --git a/include/rfl/parsing/NamedTupleParser.hpp b/include/rfl/parsing/NamedTupleParser.hpp index 8542cdb7..859958a0 100644 --- a/include/rfl/parsing/NamedTupleParser.hpp +++ b/include/rfl/parsing/NamedTupleParser.hpp @@ -15,6 +15,7 @@ #include "../internal/is_default_val_v.hpp" #include "../internal/is_extra_fields.hpp" #include "../internal/is_skip.hpp" +#include "../internal/no_extra_fields_v.hpp" #include "../internal/nth_element_t.hpp" #include "../internal/ptr_cast.hpp" #include "../to_view.hpp" @@ -284,6 +285,9 @@ struct NamedTupleParser { using U = std::remove_cvref_t; _schema->additional_properties_ = std::make_shared( Parser::to_schema(_definitions)); + } else if constexpr (internal::no_extra_fields_v && + !_no_field_names) { + _schema->additional_properties_ = false; } } diff --git a/include/rfl/parsing/schema/Type.hpp b/include/rfl/parsing/schema/Type.hpp index a3621b2a..f4d0ad82 100644 --- a/include/rfl/parsing/schema/Type.hpp +++ b/include/rfl/parsing/schema/Type.hpp @@ -79,7 +79,7 @@ struct RFL_API Type { struct Object { rfl::Object types_; - std::shared_ptr additional_properties_; + rfl::Variant> additional_properties_; }; /// All values are assumed to be required unless explicitly stated otherwise diff --git a/src/rfl/json/to_schema.cpp b/src/rfl/json/to_schema.cpp index b6ed76cd..4496398c 100644 --- a/src/rfl/json/to_schema.cpp +++ b/src/rfl/json/to_schema.cpp @@ -285,11 +285,19 @@ schema::Type type_to_json_schema_type(const parsing::schema::Type& _type, required.push_back(k); } } - auto additional_properties = - _t.additional_properties_ - ? std::make_shared(type_to_json_schema_type( - *_t.additional_properties_, _no_required)) - : std::shared_ptr(); + auto additional_properties = rfl::visit( + [&](const auto& _a) + -> rfl::Variant> { + using A = std::remove_cvref_t; + if constexpr (std::is_same()) { + return _a; + } else { + return _a ? std::make_shared( + type_to_json_schema_type(*_a, _no_required)) + : std::shared_ptr(); + } + }, + _t.additional_properties_); return schema::Type{.value = schema::Type::Object{ .properties = properties, .required = required,