Skip to content

Commit 2bcf820

Browse files
committed
emit "additionalProperties": false with rfl::NoExtraFields
1 parent 8a3c3dc commit 2bcf820

4 files changed

Lines changed: 19 additions & 7 deletions

File tree

‎include/rfl/json/schema/Type.hpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct Type {
101101
rfl::Flatten<Annotations> annotations{};
102102
rfl::Object<Type> properties{};
103103
std::vector<std::string> required{};
104-
std::shared_ptr<Type> additionalProperties{};
104+
rfl::Variant<bool, std::shared_ptr<Type>> additionalProperties{};
105105
};
106106

107107
struct OneOf {

‎include/rfl/parsing/NamedTupleParser.hpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "../internal/is_default_val_v.hpp"
1616
#include "../internal/is_extra_fields.hpp"
1717
#include "../internal/is_skip.hpp"
18+
#include "../internal/no_extra_fields_v.hpp"
1819
#include "../internal/nth_element_t.hpp"
1920
#include "../internal/ptr_cast.hpp"
2021
#include "../to_view.hpp"
@@ -284,6 +285,9 @@ struct NamedTupleParser {
284285
using U = std::remove_cvref_t<typename ExtraFieldsType::Type>;
285286
_schema->additional_properties_ = std::make_shared<schema::Type>(
286287
Parser<R, W, U, ProcessorsType>::to_schema(_definitions));
288+
} else if constexpr (internal::no_extra_fields_v<ProcessorsType> &&
289+
!_no_field_names) {
290+
_schema->additional_properties_ = false;
287291
}
288292
}
289293

‎include/rfl/parsing/schema/Type.hpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct RFL_API Type {
7979

8080
struct Object {
8181
rfl::Object<Type> types_;
82-
std::shared_ptr<Type> additional_properties_;
82+
rfl::Variant<bool, std::shared_ptr<Type>> additional_properties_;
8383
};
8484

8585
/// All values are assumed to be required unless explicitly stated otherwise

‎src/rfl/json/to_schema.cpp‎

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,19 @@ schema::Type type_to_json_schema_type(const parsing::schema::Type& _type,
285285
required.push_back(k);
286286
}
287287
}
288-
auto additional_properties =
289-
_t.additional_properties_
290-
? std::make_shared<schema::Type>(type_to_json_schema_type(
291-
*_t.additional_properties_, _no_required))
292-
: std::shared_ptr<schema::Type>();
288+
auto additional_properties = rfl::visit(
289+
[&](const auto& _a)
290+
-> rfl::Variant<bool, std::shared_ptr<schema::Type>> {
291+
using A = std::remove_cvref_t<decltype(_a)>;
292+
if constexpr (std::is_same<A, bool>()) {
293+
return _a;
294+
} else {
295+
return _a ? std::make_shared<schema::Type>(
296+
type_to_json_schema_type(*_a, _no_required))
297+
: std::shared_ptr<schema::Type>();
298+
}
299+
},
300+
_t.additional_properties_);
293301
return schema::Type{.value = schema::Type::Object{
294302
.properties = properties,
295303
.required = required,

0 commit comments

Comments
 (0)