Skip to content

Commit 8af3a4f

Browse files
authored
Adding enum to JSON schema for variants (#1447)
1 parent 9a47073 commit 8af3a4f

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

include/glaze/json/schema.hpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -462,14 +462,21 @@ namespace glz
462462
(*s.type).emplace_back("null");
463463
}
464464
s.oneOf = std::vector<schematic>(N);
465+
if (not tag_v<T>.empty()) {
466+
if (not s.properties) {
467+
s.properties = std::map<std::string_view, schema, std::less<>>{}; // allocate
468+
}
469+
//(*s.properties)[tag_v<T>].type = "string";
470+
(*s.properties)[tag_v<T>].enumeration = ids_v<T>;
471+
}
465472

466473
for_each<N>([&](auto I) {
467474
using V = std::decay_t<std::variant_alternative_t<I, T>>;
468475
auto& schema_val = (*s.oneOf)[I];
469476
to_json_schema<V>::template op<Opts>(schema_val, defs);
470-
if constexpr ((glaze_object_t<V> || reflectable<V>)&&!tag_v<T>.empty()) {
471-
if (!schema_val.required) {
472-
schema_val.required = std::vector<sv>{};
477+
if constexpr ((glaze_object_t<V> || reflectable<V>)&& not tag_v<T>.empty()) {
478+
if (not schema_val.required) {
479+
schema_val.required = std::vector<sv>{}; // allocate
473480
}
474481
schema_val.required->emplace_back(tag_v<T>);
475482
auto& tag = (*schema_val.properties)[tag_v<T>];

tests/json_test/json_test.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -3335,7 +3335,7 @@ suite tagged_variant_tests = [] {
33353335
auto s = glz::write_json_schema<tagged_variant>().value_or("error");
33363336
expect(
33373337
s ==
3338-
R"({"type":["object"],"$defs":{"int32_t":{"type":["integer"],"minimum":-2147483648,"maximum":2147483647},"std::map<std::string,int32_t>":{"type":["object"],"additionalProperties":{"$ref":"#/$defs/int32_t"}},"std::string":{"type":["string"]}},"oneOf":[{"type":["object"],"properties":{"action":{"const":"PUT"},"data":{"$ref":"#/$defs/std::map<std::string,int32_t>"}},"additionalProperties":false,"required":["action"]},{"type":["object"],"properties":{"action":{"const":"DELETE"},"data":{"$ref":"#/$defs/std::string"}},"additionalProperties":false,"required":["action"]}]})")
3338+
R"({"type":["object"],"properties":{"action":{"enum":["PUT","DELETE"]}},"$defs":{"int32_t":{"type":["integer"],"minimum":-2147483648,"maximum":2147483647},"std::map<std::string,int32_t>":{"type":["object"],"additionalProperties":{"$ref":"#/$defs/int32_t"}},"std::string":{"type":["string"]}},"oneOf":[{"type":["object"],"properties":{"action":{"const":"PUT"},"data":{"$ref":"#/$defs/std::map<std::string,int32_t>"}},"additionalProperties":false,"required":["action"]},{"type":["object"],"properties":{"action":{"const":"DELETE"},"data":{"$ref":"#/$defs/std::string"}},"additionalProperties":false,"required":["action"]}]})")
33393339
<< s;
33403340
};
33413341

@@ -3370,7 +3370,7 @@ suite tagged_variant_tests = [] {
33703370
const auto schema = glz::write_json_schema<std::shared_ptr<tagged_variant2>>().value_or("error");
33713371
expect(
33723372
schema ==
3373-
R"({"type":["object","null"],"$defs":{"int32_t":{"type":["integer"],"minimum":-2147483648,"maximum":2147483647},"std::map<std::string,int32_t>":{"type":["object"],"additionalProperties":{"$ref":"#/$defs/int32_t"}},"std::string":{"type":["string"]}},"oneOf":[{"type":["object"],"properties":{"data":{"$ref":"#/$defs/std::map<std::string,int32_t>"},"type":{"const":"put_action"}},"additionalProperties":false,"required":["type"]},{"type":["object"],"properties":{"data":{"$ref":"#/$defs/std::string"},"type":{"const":"delete_action"}},"additionalProperties":false,"required":["type"]},{"type":["null"],"const":null}]})")
3373+
R"({"type":["object","null"],"properties":{"type":{"enum":["put_action","delete_action","std::monostate"]}},"$defs":{"int32_t":{"type":["integer"],"minimum":-2147483648,"maximum":2147483647},"std::map<std::string,int32_t>":{"type":["object"],"additionalProperties":{"$ref":"#/$defs/int32_t"}},"std::string":{"type":["string"]}},"oneOf":[{"type":["object"],"properties":{"data":{"$ref":"#/$defs/std::map<std::string,int32_t>"},"type":{"const":"put_action"}},"additionalProperties":false,"required":["type"]},{"type":["object"],"properties":{"data":{"$ref":"#/$defs/std::string"},"type":{"const":"delete_action"}},"additionalProperties":false,"required":["type"]},{"type":["null"],"const":null}]})")
33743374
<< schema;
33753375
};
33763376
};
@@ -6864,7 +6864,7 @@ suite empty_variant_objects = [] {
68646864
const auto s = glz::write_json_schema<var_schema>().value_or("error");
68656865
expect(
68666866
s ==
6867-
R"({"type":["object"],"properties":{"$schema":{"$ref":"#/$defs/std::string"},"variant":{"$ref":"#/$defs/vari"}},"additionalProperties":false,"$defs":{"std::string":{"type":["string"]},"vari":{"type":["object"],"oneOf":[{"type":["object"],"properties":{"type":{"const":"varx"}},"additionalProperties":false,"required":["type"]},{"type":["object"],"properties":{"type":{"const":"vary"}},"additionalProperties":false,"required":["type"]}]}}})")
6867+
R"({"type":["object"],"properties":{"$schema":{"$ref":"#/$defs/std::string"},"variant":{"$ref":"#/$defs/vari"}},"additionalProperties":false,"$defs":{"std::string":{"type":["string"]},"vari":{"type":["object"],"properties":{"type":{"enum":["varx","vary"]}},"oneOf":[{"type":["object"],"properties":{"type":{"const":"varx"}},"additionalProperties":false,"required":["type"]},{"type":["object"],"properties":{"type":{"const":"vary"}},"additionalProperties":false,"required":["type"]}]}}})")
68686868
<< s;
68696869
};
68706870
};

0 commit comments

Comments
 (0)