diff --git a/src/idl_gen_json_schema.cpp b/src/idl_gen_json_schema.cpp index 66dfc7124..1ffd4a683 100644 --- a/src/idl_gen_json_schema.cpp +++ b/src/idl_gen_json_schema.cpp @@ -24,25 +24,6 @@ namespace flatbuffers { namespace jsons { -std::string GenNativeType(BaseType type) { - switch (type) { - case BASE_TYPE_BOOL: return "boolean"; - case BASE_TYPE_CHAR: - case BASE_TYPE_UCHAR: - case BASE_TYPE_SHORT: - case BASE_TYPE_USHORT: - case BASE_TYPE_INT: - case BASE_TYPE_UINT: - case BASE_TYPE_LONG: - case BASE_TYPE_ULONG: - case BASE_TYPE_FLOAT: - case BASE_TYPE_DOUBLE: return "number"; - case BASE_TYPE_STRING: return "string"; - case BASE_TYPE_ARRAY: return "array"; - default: return ""; - } -} - template std::string GenFullName(const T *enum_def) { std::string full_name; const auto &name_spaces = enum_def->defined_namespace->components; @@ -61,23 +42,62 @@ std::string GenType(const std::string &name) { return "\"type\" : \"" + name + "\""; } -std::string GenType(const Type &type) { - if (type.enum_def != nullptr && !type.enum_def->is_union) { - // it is a reference to an enum type - return GenTypeRef(type.enum_def); +std::string GenType(BaseType type) { + switch (type) { + case BASE_TYPE_BOOL: return "\"type\" : \"boolean\""; + case BASE_TYPE_CHAR: + return "\"type\" : \"integer\", \"minimum\" : " + + NumToString(std::numeric_limits::min()) + + ", \"maximum\" : " + + NumToString(std::numeric_limits::max()) + "\""; + case BASE_TYPE_UCHAR: + return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :" + + NumToString(std::numeric_limits::max()) + "\""; + case BASE_TYPE_SHORT: + return "\"type\" : \"integer\", \"minimum\" : " + + NumToString(std::numeric_limits::min()) + + ", \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_USHORT: + return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_INT: + return "\"type\" : \"integer\", \"minimum\" : " + + NumToString(std::numeric_limits::min()) + + ", \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_UINT: + return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_LONG: + return "\"type\" : \"integer\", \"minimum\" : " + + NumToString(std::numeric_limits::min()) + + ", \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_ULONG: + return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " + + NumToString(std::numeric_limits::max()); + case BASE_TYPE_FLOAT: + case BASE_TYPE_DOUBLE: return "\"type\" : \"number\""; + case BASE_TYPE_STRING: return "\"type\" : \"string\""; + default: return ""; } +} + +std::string GenBaseType(const Type &type) { + if (type.struct_def != nullptr) { return GenTypeRef(type.struct_def); } + if (type.enum_def != nullptr) { return GenTypeRef(type.enum_def); } + if (type.base_type == BASE_TYPE_ARRAY || type.base_type == BASE_TYPE_VECTOR) { + return "\"type\" : \"array\", \"items\" : {" + GenType(type.element) + "}"; + } + return GenType(type.base_type); +} + +std::string GenType(const Type &type) { switch (type.base_type) { case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH(); // fall thru case BASE_TYPE_VECTOR: { - std::string typeline; - typeline.append("\"type\" : \"array\", \"items\" : { "); - if (type.element == BASE_TYPE_STRUCT) { - typeline.append(GenTypeRef(type.struct_def)); - } else { - typeline.append(GenType(GenNativeType(type.element))); - } - typeline.append(" }"); - return typeline; + return GenBaseType(type); } case BASE_TYPE_STRUCT: { return GenTypeRef(type.struct_def); @@ -86,7 +106,7 @@ std::string GenType(const Type &type) { std::string union_type_string("\"anyOf\": ["); const auto &union_types = type.enum_def->Vals(); for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) { - auto &union_type = *ut; + const auto &union_type = *ut; if (union_type->union_type.base_type == BASE_TYPE_NONE) { continue; } if (union_type->union_type.base_type == BASE_TYPE_STRUCT) { union_type_string.append( @@ -100,7 +120,9 @@ std::string GenType(const Type &type) { return union_type_string; } case BASE_TYPE_UTYPE: return GenTypeRef(type.enum_def); - default: return GenType(GenNativeType(type.base_type)); + default: { + return GenBaseType(type); + } } } diff --git a/tests/arrays_test.schema.json b/tests/arrays_test.schema.json index 8c77dd134..349744751 100644 --- a/tests/arrays_test.schema.json +++ b/tests/arrays_test.schema.json @@ -9,7 +9,7 @@ "type" : "object", "properties" : { "a" : { - "type" : "array", "items" : { "type" : "number" }, + "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647}, "minItems": 2, "maxItems": 2 }, @@ -22,7 +22,7 @@ "maxItems": 2 }, "d" : { - "type" : "array", "items" : { "type" : "number" }, + "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807}, "minItems": 2, "maxItems": 2 } @@ -36,23 +36,23 @@ "type" : "number" }, "b" : { - "type" : "array", "items" : { "type" : "number" }, + "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647}, "minItems": 15, "maxItems": 15 }, "c" : { - "type" : "number" + "type" : "integer", "minimum" : -128, "maximum" : 127" }, "d" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_NestedStruct" }, + "$ref" : "#/definitions/MyGame_Example_NestedStruct", "minItems": 2, "maxItems": 2 }, "e" : { - "type" : "number" + "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647 }, "f" : { - "type" : "array", "items" : { "type" : "number" }, + "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807}, "minItems": 2, "maxItems": 2 } diff --git a/tests/monster_test.schema.json b/tests/monster_test.schema.json index e4ce0df7a..0d100d854 100644 --- a/tests/monster_test.schema.json +++ b/tests/monster_test.schema.json @@ -29,7 +29,7 @@ "type" : "object", "properties" : { "a" : { - "type" : "number" + "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647 } }, "additionalProperties" : false @@ -68,10 +68,10 @@ "type" : "object", "properties" : { "a" : { - "type" : "number" + "type" : "integer", "minimum" : -32768, "maximum" : 32767 }, "b" : { - "type" : "number" + "type" : "integer", "minimum" : -128, "maximum" : 127" } }, "additionalProperties" : false @@ -113,10 +113,10 @@ "type" : "object", "properties" : { "id" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 4294967295 }, "distance" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 4294967295 } }, "additionalProperties" : false @@ -128,10 +128,10 @@ "type" : "string" }, "val" : { - "type" : "number" + "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807 }, "count" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 65535 } }, "additionalProperties" : false @@ -140,7 +140,7 @@ "type" : "object", "properties" : { "id" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 } }, "additionalProperties" : false @@ -153,10 +153,10 @@ "$ref" : "#/definitions/MyGame_Example_Vec3" }, "mana" : { - "type" : "number" + "type" : "integer", "minimum" : -32768, "maximum" : 32767 }, "hp" : { - "type" : "number" + "type" : "integer", "minimum" : -32768, "maximum" : 32767 }, "name" : { "type" : "string" @@ -166,7 +166,7 @@ "deprecated" : true, }, "inventory" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"} }, "color" : { "$ref" : "#/definitions/MyGame_Example_Color" @@ -178,19 +178,19 @@ "anyOf": [{ "$ref" : "#/definitions/MyGame_Example_Monster" },{ "$ref" : "#/definitions/MyGame_Example_TestSimpleTableWithEnum" },{ "$ref" : "#/definitions/MyGame_Example2_Monster" }] }, "test4" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } + "$ref" : "#/definitions/MyGame_Example_Test" }, "testarrayofstring" : { - "type" : "array", "items" : { "type" : "string" } + "type" : "array", "items" : {"type" : "string"} }, "testarrayoftables" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Monster" } + "$ref" : "#/definitions/MyGame_Example_Monster" }, "enemy" : { "$ref" : "#/definitions/MyGame_Example_Monster" }, "testnestedflatbuffer" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"} }, "testempty" : { "$ref" : "#/definitions/MyGame_Example_Stat" @@ -199,31 +199,31 @@ "type" : "boolean" }, "testhashs32_fnv1" : { - "type" : "number" + "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647 }, "testhashu32_fnv1" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 4294967295 }, "testhashs64_fnv1" : { - "type" : "number" + "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807 }, "testhashu64_fnv1" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "testhashs32_fnv1a" : { - "type" : "number" + "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647 }, "testhashu32_fnv1a" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 4294967295 }, "testhashs64_fnv1a" : { - "type" : "number" + "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807 }, "testhashu64_fnv1a" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "testarrayofbools" : { - "type" : "array", "items" : { "type" : "boolean" } + "type" : "array", "items" : {"type" : "boolean"} }, "testf" : { "type" : "number" @@ -235,49 +235,49 @@ "type" : "number" }, "testarrayofstring2" : { - "type" : "array", "items" : { "type" : "string" } + "type" : "array", "items" : {"type" : "string"} }, "testarrayofsortedstruct" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Ability" } + "$ref" : "#/definitions/MyGame_Example_Ability" }, "flex" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"} }, "test5" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } + "$ref" : "#/definitions/MyGame_Example_Test" }, "vector_of_longs" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807} }, "vector_of_doubles" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "number"} }, "parent_namespace_test" : { "$ref" : "#/definitions/MyGame_InParentNamespace" }, "vector_of_referrables" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" } + "$ref" : "#/definitions/MyGame_Example_Referrable" }, "single_weak_reference" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "vector_of_weak_references" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615} }, "vector_of_strong_referrables" : { - "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" } + "$ref" : "#/definitions/MyGame_Example_Referrable" }, "co_owning_reference" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "vector_of_co_owning_references" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615} }, "non_owning_reference" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "vector_of_non_owning_references" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615} }, "any_unique_type" : { "$ref" : "#/definitions/MyGame_Example_AnyUniqueAliases" @@ -305,28 +305,28 @@ "type" : "object", "properties" : { "i8" : { - "type" : "number" + "type" : "integer", "minimum" : -128, "maximum" : 127" }, "u8" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" :255" }, "i16" : { - "type" : "number" + "type" : "integer", "minimum" : -32768, "maximum" : 32767 }, "u16" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 65535 }, "i32" : { - "type" : "number" + "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647 }, "u32" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 4294967295 }, "i64" : { - "type" : "number" + "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807 }, "u64" : { - "type" : "number" + "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615 }, "f32" : { "type" : "number" @@ -335,10 +335,10 @@ "type" : "number" }, "v8" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "integer", "minimum" : -128, "maximum" : 127"} }, "vf64" : { - "type" : "array", "items" : { "type" : "number" } + "type" : "array", "items" : {"type" : "number"} } }, "additionalProperties" : false