diff --git a/schemars/src/main.rs b/schemars/src/main.rs index b5feaf0..ec8cfc4 100644 --- a/schemars/src/main.rs +++ b/schemars/src/main.rs @@ -6,7 +6,6 @@ use make_schema::MakeSchema; use schema::*; use serde::{Deserialize, Serialize}; use serde_json::Result; -use std::collections::BTreeMap as Map; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] @@ -34,10 +33,27 @@ struct User { username: String, } +impl MakeSchema for User { + fn generates_ref_schema() -> bool { + true + } + + fn make_schema(gen: &mut generator::SchemaGenerator) -> Schema { + let mut o = SchemaObject { + ..Default::default() + }; + o.properties + .insert("id".to_owned(), gen.subschema_for::()); + o.properties + .insert("username".to_owned(), gen.subschema_for::()); + o.into() + } +} + fn main() -> Result<()> { let gen = generator::SchemaGenerator::new(); - let schema = gen.into_root_schema_for::(); - let json = serde_json::to_string(&schema)?; + let schema = gen.into_root_schema_for::(); + let json = serde_json::to_string_pretty(&schema)?; println!("{}", json); /*let todo = Todo { diff --git a/schemars/src/make_schema.rs b/schemars/src/make_schema.rs index db78ede..1c7d986 100644 --- a/schemars/src/make_schema.rs +++ b/schemars/src/make_schema.rs @@ -26,7 +26,7 @@ pub trait MakeSchema { false } - fn make_schema(generator: &mut SchemaGenerator) -> Schema; + fn make_schema(gen: &mut SchemaGenerator) -> Schema; } // TODO structs, enums, tuples @@ -76,12 +76,12 @@ simple_impl!(() => Null); impl MakeSchema for char { fn make_schema(_: &mut SchemaGenerator) -> Schema { - let mut extra_properties = Map::new(); - extra_properties.insert("minLength".to_owned(), json!(1)); - extra_properties.insert("maxLength".to_owned(), json!(1)); + let mut extensions = Map::new(); + extensions.insert("minLength".to_owned(), json!(1)); + extensions.insert("maxLength".to_owned(), json!(1)); SchemaObject { instance_type: Some(InstanceType::String.into()), - extra_properties, + extensions, ..Default::default() } .into() @@ -93,11 +93,11 @@ impl MakeSchema for char { // Does not require T: MakeSchema. impl MakeSchema for [T; 0] { fn make_schema(_: &mut SchemaGenerator) -> Schema { - let mut extra_properties = Map::new(); - extra_properties.insert("maxItems".to_owned(), json!(0)); + let mut extensions = Map::new(); + extensions.insert("maxItems".to_owned(), json!(0)); SchemaObject { instance_type: Some(InstanceType::Array.into()), - extra_properties, + extensions, ..Default::default() } .into() @@ -110,13 +110,13 @@ macro_rules! array_impls { impl MakeSchema for [T; $len] { fn make_schema(gen: &mut SchemaGenerator) -> Schema { - let mut extra_properties = Map::new(); - extra_properties.insert("minItems".to_owned(), json!($len)); - extra_properties.insert("maxItems".to_owned(), json!($len)); + let mut extensions = Map::new(); + extensions.insert("minItems".to_owned(), json!($len)); + extensions.insert("maxItems".to_owned(), json!($len)); SchemaObject { instance_type: Some(InstanceType::Array.into()), items: Some(Box::from(gen.subschema_for::())), - extra_properties, + extensions, ..Default::default() }.into() } @@ -170,14 +170,14 @@ macro_rules! map_impl { { fn make_schema(gen: &mut SchemaGenerator) -> Schema { - let mut extra_properties = Map::new(); - extra_properties.insert( + let mut extensions = Map::new(); + extensions.insert( "additionalProperties".to_owned(), json!(gen.subschema_for::()) ); SchemaObject { instance_type: Some(InstanceType::Object.into()), - extra_properties, + extensions, ..Default::default() }.into() } diff --git a/schemars/src/schema.rs b/schemars/src/schema.rs index 68ec599..2ac72c0 100644 --- a/schemars/src/schema.rs +++ b/schemars/src/schema.rs @@ -66,7 +66,7 @@ pub struct SchemaObject { #[serde(skip_serializing_if = "Map::is_empty")] pub definitions: Map, #[serde(flatten)] - pub extra_properties: Map, + pub extensions: Map, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]