diff --git a/schemars/src/gen.rs b/schemars/src/gen.rs index 5f8ac3b..aff686c 100644 --- a/schemars/src/gen.rs +++ b/schemars/src/gen.rs @@ -374,11 +374,29 @@ impl SchemaGenerator { } fn json_schema_internal(&mut self, name: &str) -> Schema { - self.pending_schema_names.insert(name.to_owned()); - let schema = T::json_schema(self); - // FIXME schema name not removed if previous line panics - self.pending_schema_names.remove(name); - schema + struct PendingSchemaState<'a> { + gen: &'a mut SchemaGenerator, + name: &'a str, + did_add: bool, + } + + impl<'a> PendingSchemaState<'a> { + fn new(gen: &'a mut SchemaGenerator, name: &'a str) -> Self { + let did_add = gen.pending_schema_names.insert(name.to_owned()); + Self { gen, name, did_add } + } + } + + impl Drop for PendingSchemaState<'_> { + fn drop(&mut self) { + if self.did_add { + self.gen.pending_schema_names.remove(self.name); + } + } + } + + let pss = PendingSchemaState::new(self, name); + T::json_schema(pss.gen) } } diff --git a/schemars/tests/expected/inline-subschemas-recursive.json b/schemars/tests/expected/inline-subschemas-recursive.json index cba686f..e051e5d 100644 --- a/schemars/tests/expected/inline-subschemas-recursive.json +++ b/schemars/tests/expected/inline-subschemas-recursive.json @@ -23,29 +23,7 @@ ], "properties": { "recursive": { - "type": "object", - "properties": { - "direct": { - "anyOf": [ - { - "$ref": "#/definitions/RecursiveOuter" - }, - { - "type": "null" - } - ] - }, - "indirect": { - "anyOf": [ - { - "$ref": "#/definitions/RecursiveInner" - }, - { - "type": "null" - } - ] - } - } + "$ref": "#/definitions/RecursiveOuter" } } } @@ -79,17 +57,6 @@ } } } - }, - "RecursiveInner": { - "type": "object", - "required": [ - "recursive" - ], - "properties": { - "recursive": { - "$ref": "#/definitions/RecursiveOuter" - } - } } } } \ No newline at end of file