schemars/json_schema_impls/
tuple.rs

1use crate::gen::SchemaGenerator;
2use crate::schema::*;
3use crate::JsonSchema;
4
5macro_rules! tuple_impls {
6    ($($len:expr => ($($name:ident)+))+) => {
7        $(
8            impl<$($name: JsonSchema),+> JsonSchema for ($($name,)+) {
9                no_ref_schema!();
10
11                fn schema_name() -> String {
12                    let mut name = "Tuple_of_".to_owned();
13                    name.push_str(&[$($name::schema_name()),+].join("_and_"));
14                    name
15                }
16
17                fn json_schema(gen: &mut SchemaGenerator) -> Schema {
18                    let items = vec![
19                        $(gen.subschema_for::<$name>()),+
20                    ];
21                    SchemaObject {
22                        instance_type: Some(InstanceType::Array.into()),
23                        array: Some(Box::new(ArrayValidation {
24                            items: Some(items.into()),
25                            max_items: Some($len),
26                            min_items: Some($len),
27                            ..Default::default()
28                        })),
29                        ..Default::default()
30                    }
31                    .into()
32                }
33            }
34        )+
35    }
36}
37
38tuple_impls! {
39    1 => (T0)
40    2 => (T0 T1)
41    3 => (T0 T1 T2)
42    4 => (T0 T1 T2 T3)
43    5 => (T0 T1 T2 T3 T4)
44    6 => (T0 T1 T2 T3 T4 T5)
45    7 => (T0 T1 T2 T3 T4 T5 T6)
46    8 => (T0 T1 T2 T3 T4 T5 T6 T7)
47    9 => (T0 T1 T2 T3 T4 T5 T6 T7 T8)
48    10 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9)
49    11 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10)
50    12 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11)
51    13 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12)
52    14 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13)
53    15 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14)
54    16 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15)
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60    use crate::tests::{schema_for, schema_object_for};
61    use pretty_assertions::assert_eq;
62
63    #[test]
64    fn schema_for_map_any_value() {
65        let schema = schema_object_for::<(i32, bool)>();
66        assert_eq!(
67            schema.instance_type,
68            Some(SingleOrVec::from(InstanceType::Array))
69        );
70        let array_validation = schema.array.unwrap();
71        assert_eq!(
72            array_validation.items,
73            Some(SingleOrVec::Vec(vec![
74                schema_for::<i32>(),
75                schema_for::<bool>()
76            ]))
77        );
78        assert_eq!(array_validation.max_items, Some(2));
79        assert_eq!(array_validation.min_items, Some(2));
80    }
81}