diff --git a/schemars/src/generator.rs b/schemars/src/generator.rs index 6d6e183..be32c61 100644 --- a/schemars/src/generator.rs +++ b/schemars/src/generator.rs @@ -18,6 +18,10 @@ impl SchemaGenerator { } pub fn subschema_for(&mut self) -> Schema { + if !T::generates_ref_schema() { + return T::make_schema(self); + } + let type_id = TypeId::of::(); // TODO is there a nicer way to do this? if !self.definitions.contains_key(&type_id) { @@ -52,13 +56,21 @@ impl SchemaGenerator { schema } - fn schema_name() -> String { - let override_name = T::override_schema_name(); - if override_name.is_empty() { - type_name::().to_owned() - } else { - override_name + pub fn into_root_schema_for(mut self) -> Schema { + let schema = T::make_schema(&mut self); + if let Schema::Object(mut o) = schema { + o.schema = Some("http://json-schema.org/draft-07/schema#".to_owned()); + o.title = Some(Self::schema_name::()); + for (_, (name, schema)) in self.definitions { + o.definitions.insert(name, schema); + } + return Schema::Object(o); } + schema + } + + fn schema_name() -> String { + T::override_schema_name().unwrap_or_else(|| type_name::().to_owned()) } fn make_unique_name(&mut self) -> String { diff --git a/schemars/src/make_schema.rs b/schemars/src/make_schema.rs index 091045b..7ce7fa8 100644 --- a/schemars/src/make_schema.rs +++ b/schemars/src/make_schema.rs @@ -4,11 +4,11 @@ use serde_json::json; use std::collections::BTreeMap as Map; pub trait MakeSchema { - fn override_schema_name() -> String { - String::new() + fn override_schema_name() -> Option { + None } - fn makes_ref_schema() -> bool { + fn generates_ref_schema() -> bool { false }