diff --git a/schemars/src/make_schema.rs b/schemars/src/make_schema.rs index 1937714..dea9770 100644 --- a/schemars/src/make_schema.rs +++ b/schemars/src/make_schema.rs @@ -306,6 +306,18 @@ impl MakeSchema for Option { } } +impl MakeSchema for std::marker::PhantomData { + no_ref_schema!(); + + fn schema_name() -> String { + <()>::schema_name() + } + + fn make_schema(gen: &mut SchemaGenerator) -> Result { + <()>::make_schema(gen) + } +} + ////////// DEREF ////////// macro_rules! deref_impl { diff --git a/schemars/tests/test.rs b/schemars/tests/metaschema.rs similarity index 100% rename from schemars/tests/test.rs rename to schemars/tests/metaschema.rs diff --git a/schemars/tests/naming.rs b/schemars/tests/naming.rs new file mode 100644 index 0000000..91a52cb --- /dev/null +++ b/schemars/tests/naming.rs @@ -0,0 +1,87 @@ +use pretty_assertions::assert_eq; +use schemars::{schema_for, MakeSchema}; +use serde::{Deserialize, Serialize}; +use std::error::Error; + +const EXPECTED: &str = r#" +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MyStruct_For_Integer_And_Null_And_Boolean_And_Array_Of_String", + "type": "object", + "properties": { + "float": { + "type": "number" + }, + "t": { + "type": "integer" + }, + "u": { + "type": "null" + }, + "v": { + "type": "boolean" + }, + "w": { + "type": "array", + "items": { + "type": "string" + } + } + } +} +"#; + +#[derive(Serialize, Deserialize, Debug, PartialEq, MakeSchema)] +struct MyStruct { + t: T, + u: U, + float: f32, + v: V, + w: W, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, MakeSchema)] +#[serde(rename = "MyStruct")] +struct MyRenamedStruct { + t: T, + u: U, + float: f32, + v: V, + w: W, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, MakeSchema)] +#[serde(remote = "MyStruct")] +struct MyRemoteStruct { + t: T, + u: U, + float: f32, + v: V, + w: W, +} + +#[test] +fn default_name_multiple_type_params() -> Result<(), Box> { + let actual = schema_for!(MyStruct>)?; + let expected = serde_json::from_str(EXPECTED)?; + assert_eq!(actual, expected); + Ok(()) +} + +#[test] +#[ignore] // not yet implemented +fn overriden_with_rename_name_multiple_type_params() -> Result<(), Box> { + let actual = schema_for!(MyRenamedStruct>)?; + let expected = serde_json::from_str(EXPECTED)?; + assert_eq!(actual, expected); + Ok(()) +} + +#[test] +#[ignore] // not yet implemented +fn overriden_with_remote_name_multiple_type_params() -> Result<(), Box> { + let actual = schema_for!(MyRemoteStruct>)?; + let expected = serde_json::from_str(EXPECTED)?; + assert_eq!(actual, expected); + Ok(()) +} diff --git a/schemars_derive/src/lib.rs b/schemars_derive/src/lib.rs index dc70561..e1f2117 100644 --- a/schemars_derive/src/lib.rs +++ b/schemars_derive/src/lib.rs @@ -33,8 +33,7 @@ pub fn derive_make_schema(input: proc_macro::TokenStream) -> proc_macro::TokenSt let type_params: Vec<_> = cont.generics.type_params().map(|ty| &ty.ident).collect(); let type_param_fmt = match type_params.len() { 0 => "{}".to_owned(), - 1 => "{}_For_{}".to_owned(), - n => format!("{{}}_For_{{}}_And{}", "_{}".repeat(n - 1)), + n => format!("{{}}_For_{{}}{}", "_And_{}".repeat(n - 1)), }; let (impl_generics, ty_generics, where_clause) = cont.generics.split_for_impl();