From 5593ccda29a9787c1e9924501e9eae42af588b80 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 15:34:42 -0400 Subject: [PATCH 01/13] Improve handling of internally tagged enum with newtypes --- schemars_derive/src/schema_exprs.rs | 36 +++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 0b30e2e6..4634ba22 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -136,6 +136,38 @@ fn expr_for_field(field: &Field, allow_ref: bool) -> SchemaExpr { schema_expr } +fn expr_for_internally_tagged_newtype_field(field: &Field) -> SchemaExpr { + let (ty, type_def) = type_for_field_schema(field); + let span = field.original.span(); + + let mut schema_expr = SchemaExpr::from(if field.attrs.validation.required { + quote_spanned! {span=> + <#ty as schemars::JsonSchema>::_schemars_private_non_optional_json_schema(#GENERATOR) + } + } else { + let keyword = "allOf"; + quote_spanned!(span => + { + if (#GENERATOR.settings().inline_subschemas) { + <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) + } else { + let mut map = schemars::_private::serde_json::Map::new(); + map.insert( + #keyword.into(), + #GENERATOR.subschema_for::<#ty>().to_value() + ); + schemars::Schema::from(map) + } + } + ) + }); + + schema_expr.definitions.extend(type_def); + field.add_mutators(&mut schema_expr.mutators); + + schema_expr +} + pub fn type_for_field_schema(field: &Field) -> (syn::Type, Option) { match &field.attrs.with { None => (field.ty.to_owned(), None), @@ -266,10 +298,10 @@ fn expr_for_internal_tagged_enum<'a>( ) -> SchemaExpr { let variant_schemas = variants .map(|variant| { - let mut schema_expr = expr_for_internal_tagged_enum_variant(variant, deny_unknown_fields); let name = variant.name(); + schema_expr.mutators.push(quote!( schemars::_private::apply_internal_enum_variant_tag(&mut #SCHEMA, #tag_name, #name, #deny_unknown_fields); )); @@ -430,7 +462,7 @@ fn expr_for_internal_tagged_enum_variant( match variant.style { Style::Unit => expr_for_unit_struct(), - Style::Newtype => expr_for_field(&variant.fields[0], false), + Style::Newtype => expr_for_internally_tagged_newtype_field(&variant.fields[0]), Style::Tuple => expr_for_tuple_struct(&variant.fields), Style::Struct => expr_for_struct(&variant.fields, &SerdeDefault::None, deny_unknown_fields), } From 5c87020ed326064aeef19e25fd48f44499a38e8f Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 15:50:30 -0400 Subject: [PATCH 02/13] Fix accidental spacing changes --- schemars_derive/src/schema_exprs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 4634ba22..72d4d430 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -298,10 +298,10 @@ fn expr_for_internal_tagged_enum<'a>( ) -> SchemaExpr { let variant_schemas = variants .map(|variant| { + let mut schema_expr = expr_for_internal_tagged_enum_variant(variant, deny_unknown_fields); let name = variant.name(); - schema_expr.mutators.push(quote!( schemars::_private::apply_internal_enum_variant_tag(&mut #SCHEMA, #tag_name, #name, #deny_unknown_fields); )); From e3a4d846fd3bd3e584a7fae37bd49e42e3d57aa9 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 16:06:21 -0400 Subject: [PATCH 03/13] Fix broken test cases --- .../enums.rs~internally_tagged_enum.json | 47 ++++++++++++++----- ...nown_fields.rs~internally_tagged_enum.json | 39 ++++++++++----- ...tend.rs~extend_internally_tagged_enum.json | 1 + 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json index e91dcb6a..a5add46a 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json @@ -22,8 +22,11 @@ "const": "StringMap" } }, - "additionalProperties": { - "type": "string" + "allOf": { + "type": "object", + "additionalProperties": { + "type": "string" + } }, "required": [ "tag" @@ -37,6 +40,9 @@ "const": "UnitStructNewType" } }, + "allOf": { + "$ref": "#/$defs/UnitStruct" + }, "required": [ "tag" ] @@ -44,22 +50,16 @@ { "type": "object", "properties": { - "foo": { - "type": "integer", - "format": "int32" - }, - "bar": { - "type": "boolean" - }, "tag": { "type": "string", "const": "StructNewType" } }, + "allOf": { + "$ref": "#/$defs/Struct" + }, "required": [ - "tag", - "foo", - "bar" + "tag" ] }, { @@ -95,5 +95,26 @@ "tag" ] } - ] + ], + "$defs": { + "UnitStruct": { + "type": "null" + }, + "Struct": { + "type": "object", + "properties": { + "foo": { + "type": "integer", + "format": "int32" + }, + "bar": { + "type": "boolean" + } + }, + "required": [ + "foo", + "bar" + ] + } + } } \ No newline at end of file diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json index 2e5b8c88..b5ff1c01 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json @@ -23,8 +23,26 @@ "const": "StringMap" } }, - "additionalProperties": { - "type": "string" + "allOf": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "required": [ + "tag" + ] + }, + { + "type": "object", + "properties": { + "tag": { + "type": "string", + "const": "StructNewType" + } + }, + "allOf": { + "$ref": "#/$defs/Struct" }, "required": [ "tag" @@ -42,16 +60,19 @@ }, "tag": { "type": "string", - "const": "StructNewType" + "const": "Struct" } }, + "additionalProperties": false, "required": [ "tag", "foo", "bar" ] - }, - { + } + ], + "$defs": { + "Struct": { "type": "object", "properties": { "foo": { @@ -60,18 +81,12 @@ }, "bar": { "type": "boolean" - }, - "tag": { - "type": "string", - "const": "Struct" } }, - "additionalProperties": false, "required": [ - "tag", "foo", "bar" ] } - ] + } } \ No newline at end of file diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index c0f6354e..cfe8624a 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,6 +23,7 @@ "const": "NewType" } }, + "allOf": "true", "required": [ "t" ], From 6d14abe0e1b46784f8e717265c0699435c3d3460 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 16:09:13 -0400 Subject: [PATCH 04/13] Fix last broken test case --- .../integration/extend.rs~extend_internally_tagged_enum.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index cfe8624a..3ef2e9a7 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,7 +23,7 @@ "const": "NewType" } }, - "allOf": "true", + "allOf": true, "required": [ "t" ], From e62d14227f3546faab4b1e410ac65c2205616248 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 16:25:29 -0400 Subject: [PATCH 05/13] Fix type of allof --- .../integration/enums.rs~internally_tagged_enum.json | 12 ++++++------ ...eny_unknown_fields.rs~internally_tagged_enum.json | 8 ++++---- .../extend.rs~extend_internally_tagged_enum.json | 2 +- schemars_derive/src/schema_exprs.rs | 7 ++++++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json index a5add46a..07d2adc6 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json @@ -22,12 +22,12 @@ "const": "StringMap" } }, - "allOf": { + "allOf": [{ "type": "object", "additionalProperties": { "type": "string" } - }, + }], "required": [ "tag" ] @@ -40,9 +40,9 @@ "const": "UnitStructNewType" } }, - "allOf": { + "allOf": [{ "$ref": "#/$defs/UnitStruct" - }, + }], "required": [ "tag" ] @@ -55,9 +55,9 @@ "const": "StructNewType" } }, - "allOf": { + "allOf": [{ "$ref": "#/$defs/Struct" - }, + }], "required": [ "tag" ] diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json index b5ff1c01..4718011f 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json @@ -23,12 +23,12 @@ "const": "StringMap" } }, - "allOf": { + "allOf": [{ "type": "object", "additionalProperties": { "type": "string" } - }, + }], "required": [ "tag" ] @@ -41,9 +41,9 @@ "const": "StructNewType" } }, - "allOf": { + "allOf": [{ "$ref": "#/$defs/Struct" - }, + }], "required": [ "tag" ] diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index 3ef2e9a7..22a77713 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,7 +23,7 @@ "const": "NewType" } }, - "allOf": true, + "allOf": [true], "required": [ "t" ], diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 72d4d430..320645df 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -154,7 +154,12 @@ fn expr_for_internally_tagged_newtype_field(field: &Field) -> SchemaExpr { let mut map = schemars::_private::serde_json::Map::new(); map.insert( #keyword.into(), - #GENERATOR.subschema_for::<#ty>().to_value() + schemars::_private::serde_json::Value::Array({ + let mut enum_values = schemars::_private::alloc::vec::Vec::new(); + enum_values.push(#GENERATOR.subschema_for::<#ty>().to_value()); + enum_values + }), + ); schemars::Schema::from(map) } From 4677bd18b68a352b3f066943e2124c4ecbe9560e Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 16:30:50 -0400 Subject: [PATCH 06/13] Fix test cases --- .../enums.rs~internally_tagged_enum.json | 28 +++++++++++-------- ...nown_fields.rs~internally_tagged_enum.json | 20 +++++++------ ...tend.rs~extend_internally_tagged_enum.json | 4 ++- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json index 07d2adc6..3f616b9e 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json @@ -22,12 +22,14 @@ "const": "StringMap" } }, - "allOf": [{ - "type": "object", - "additionalProperties": { - "type": "string" + "allOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } } - }], + ], "required": [ "tag" ] @@ -40,9 +42,11 @@ "const": "UnitStructNewType" } }, - "allOf": [{ - "$ref": "#/$defs/UnitStruct" - }], + "allOf": [ + { + "$ref": "#/$defs/UnitStruct" + } + ], "required": [ "tag" ] @@ -55,9 +59,11 @@ "const": "StructNewType" } }, - "allOf": [{ - "$ref": "#/$defs/Struct" - }], + "allOf": [ + { + "$ref": "#/$defs/Struct" + } + ], "required": [ "tag" ] diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json index 4718011f..cc1620a1 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums_deny_unknown_fields.rs~internally_tagged_enum.json @@ -23,12 +23,14 @@ "const": "StringMap" } }, - "allOf": [{ - "type": "object", - "additionalProperties": { - "type": "string" + "allOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } } - }], + ], "required": [ "tag" ] @@ -41,9 +43,11 @@ "const": "StructNewType" } }, - "allOf": [{ - "$ref": "#/$defs/Struct" - }], + "allOf": [ + { + "$ref": "#/$defs/Struct" + } + ], "required": [ "tag" ] diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index 22a77713..a6a17a06 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,7 +23,9 @@ "const": "NewType" } }, - "allOf": [true], + "allOf": [ + true + ], "required": [ "t" ], From 0fa15d79ac452fb60942ddb8fc25d2e456fee632 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 17:04:57 -0400 Subject: [PATCH 07/13] Fix handling of unit types --- schemars_derive/src/schema_exprs.rs | 32 +++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 320645df..44b367c6 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -151,17 +151,27 @@ fn expr_for_internally_tagged_newtype_field(field: &Field) -> SchemaExpr { if (#GENERATOR.settings().inline_subschemas) { <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) } else { - let mut map = schemars::_private::serde_json::Map::new(); - map.insert( - #keyword.into(), - schemars::_private::serde_json::Value::Array({ - let mut enum_values = schemars::_private::alloc::vec::Vec::new(); - enum_values.push(#GENERATOR.subschema_for::<#ty>().to_value()); - enum_values - }), - - ); - schemars::Schema::from(map) + let subschema = <#ty as schemars::JsonSchema>::json_schema(#GENERATOR); + dbg!(); + if let Some(type_val) = subschema.get("type") { + if (type_val.as_str().unwrap() != "None") { + let mut map = schemars::_private::serde_json::Map::new(); + map.insert( + #keyword.into(), + schemars::_private::serde_json::Value::Array({ + let mut enum_values = schemars::_private::alloc::vec::Vec::new(); + enum_values.push(#GENERATOR.subschema_for::<#ty>().to_value()); + enum_values + }), + + ); + schemars::Schema::from(map) + } else { + <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) + } + } else { + <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) + } } } ) From 20b51b9266622b04ba855f5dc357787d8681693d Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 17:07:23 -0400 Subject: [PATCH 08/13] Fix unit test case --- .../integration/extend.rs~extend_internally_tagged_enum.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index a6a17a06..c0f6354e 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,9 +23,6 @@ "const": "NewType" } }, - "allOf": [ - true - ], "required": [ "t" ], From 1ca521eed626a60fac2c39f529da1dd3a925321f Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 17:13:44 -0400 Subject: [PATCH 09/13] Fix schema for unit type --- .../tests/integration/enums.rs~internally_tagged_enum.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json index 3f616b9e..88bb08ab 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json @@ -42,11 +42,6 @@ "const": "UnitStructNewType" } }, - "allOf": [ - { - "$ref": "#/$defs/UnitStruct" - } - ], "required": [ "tag" ] From 12130a293b7bb5334dba6a701e2fff89d8c774dc Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 17:17:25 -0400 Subject: [PATCH 10/13] Fix bug in type check --- schemars_derive/src/schema_exprs.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index 44b367c6..feeefdf0 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -152,9 +152,8 @@ fn expr_for_internally_tagged_newtype_field(field: &Field) -> SchemaExpr { <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) } else { let subschema = <#ty as schemars::JsonSchema>::json_schema(#GENERATOR); - dbg!(); if let Some(type_val) = subschema.get("type") { - if (type_val.as_str().unwrap() != "None") { + if (type_val.as_str().unwrap() != "null") { let mut map = schemars::_private::serde_json::Map::new(); map.insert( #keyword.into(), From 40179d314faf6e281b99241c686e07e1193fed51 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 17:19:23 -0400 Subject: [PATCH 11/13] Fix test case --- .../tests/integration/enums.rs~internally_tagged_enum.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json index 88bb08ab..639802f3 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/enums.rs~internally_tagged_enum.json @@ -98,9 +98,6 @@ } ], "$defs": { - "UnitStruct": { - "type": "null" - }, "Struct": { "type": "object", "properties": { From fe2eda94570d329afbd56299b39ba49c1095953a Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 23:36:13 -0400 Subject: [PATCH 12/13] Fix handling of schemas without any type --- schemars_derive/src/schema_exprs.rs | 30 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/schemars_derive/src/schema_exprs.rs b/schemars_derive/src/schema_exprs.rs index feeefdf0..254076be 100644 --- a/schemars_derive/src/schema_exprs.rs +++ b/schemars_derive/src/schema_exprs.rs @@ -152,22 +152,20 @@ fn expr_for_internally_tagged_newtype_field(field: &Field) -> SchemaExpr { <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) } else { let subschema = <#ty as schemars::JsonSchema>::json_schema(#GENERATOR); - if let Some(type_val) = subschema.get("type") { - if (type_val.as_str().unwrap() != "null") { - let mut map = schemars::_private::serde_json::Map::new(); - map.insert( - #keyword.into(), - schemars::_private::serde_json::Value::Array({ - let mut enum_values = schemars::_private::alloc::vec::Vec::new(); - enum_values.push(#GENERATOR.subschema_for::<#ty>().to_value()); - enum_values - }), - - ); - schemars::Schema::from(map) - } else { - <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) - } + let subschema_type = subschema.get("type"); + let is_null_type = subschema_type.is_some() && subschema_type.unwrap().as_str().unwrap() == "null"; + if !is_null_type { + let mut map = schemars::_private::serde_json::Map::new(); + map.insert( + #keyword.into(), + schemars::_private::serde_json::Value::Array({ + let mut enum_values = schemars::_private::alloc::vec::Vec::new(); + enum_values.push(#GENERATOR.subschema_for::<#ty>().to_value()); + enum_values + }), + + ); + schemars::Schema::from(map) } else { <#ty as schemars::JsonSchema>::json_schema(#GENERATOR) } From e84cd3bb2e581add66eda56c647e34bbca5238b3 Mon Sep 17 00:00:00 2001 From: Brandon Lax Date: Sat, 12 Oct 2024 23:38:43 -0400 Subject: [PATCH 13/13] Fix test with latest change --- .../integration/extend.rs~extend_internally_tagged_enum.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json index c0f6354e..a6a17a06 100644 --- a/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json +++ b/schemars/tests/integration/snapshots/schemars/tests/integration/extend.rs~extend_internally_tagged_enum.json @@ -23,6 +23,9 @@ "const": "NewType" } }, + "allOf": [ + true + ], "required": [ "t" ],