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}