schemars/json_schema_impls/
sequences.rs

1use crate::gen::SchemaGenerator;
2use crate::schema::*;
3use crate::JsonSchema;
4use std::borrow::Cow;
5
6macro_rules! seq_impl {
7    ($($desc:tt)+) => {
8        impl $($desc)+
9        where
10            T: JsonSchema,
11        {
12            no_ref_schema!();
13
14            fn schema_name() -> String {
15                format!("Array_of_{}", T::schema_name())
16            }
17
18            fn schema_id() -> Cow<'static, str> {
19                Cow::Owned(
20                    format!("[{}]", T::schema_id()))
21            }
22
23            fn json_schema(gen: &mut SchemaGenerator) -> Schema {
24                SchemaObject {
25                    instance_type: Some(InstanceType::Array.into()),
26                    array: Some(Box::new(ArrayValidation {
27                        items: Some(gen.subschema_for::<T>().into()),
28                        ..Default::default()
29                    })),
30                    ..Default::default()
31                }
32                .into()
33            }
34        }
35    };
36}
37
38macro_rules! set_impl {
39    ($($desc:tt)+) => {
40        impl $($desc)+
41        where
42            T: JsonSchema,
43        {
44            no_ref_schema!();
45
46            fn schema_name() -> String {
47                format!("Set_of_{}", T::schema_name())
48            }
49
50            fn schema_id() -> Cow<'static, str> {
51                Cow::Owned(
52                    format!("Set<{}>", T::schema_id()))
53            }
54
55            fn json_schema(gen: &mut SchemaGenerator) -> Schema {
56                SchemaObject {
57                    instance_type: Some(InstanceType::Array.into()),
58                    array: Some(Box::new(ArrayValidation {
59                        unique_items: Some(true),
60                        items: Some(gen.subschema_for::<T>().into()),
61                        ..Default::default()
62                    })),
63                    ..Default::default()
64                }
65                .into()
66            }
67        }
68    };
69}
70
71seq_impl!(<T> JsonSchema for std::collections::BinaryHeap<T>);
72seq_impl!(<T> JsonSchema for std::collections::LinkedList<T>);
73seq_impl!(<T> JsonSchema for [T]);
74seq_impl!(<T> JsonSchema for Vec<T>);
75seq_impl!(<T> JsonSchema for std::collections::VecDeque<T>);
76
77set_impl!(<T> JsonSchema for std::collections::BTreeSet<T>);
78set_impl!(<T, H> JsonSchema for std::collections::HashSet<T, H>);