1use crate::{
6 schema::{DataModelType, DataModelVariant, NamedType, NamedValue, NamedVariant},
7 Schema,
8};
9use core::{
10 num::{
11 NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroU128, NonZeroU16,
12 NonZeroU32, NonZeroU64, NonZeroU8,
13 },
14 ops::{Range, RangeFrom, RangeInclusive, RangeTo},
15};
16
17macro_rules! impl_schema {
18 ($($t:ty: $sdm:expr),*) => {
19 $(
20 impl Schema for $t {
21 const SCHEMA: &'static NamedType = &NamedType {
22 name: stringify!($t),
23 ty: &$sdm,
24 };
25 }
26 )*
27 };
28 (tuple => [$(($($generic:ident),*)),*]) => {
29 $(
30 impl<$($generic: Schema),*> Schema for ($($generic,)*) {
31 const SCHEMA: &'static NamedType = &NamedType {
32 name: stringify!(($($generic,)*)),
33 ty: &DataModelType::Tuple(&[$($generic::SCHEMA),*]),
34 };
35 }
36 )*
37 };
38}
39
40impl_schema![
41 u8: DataModelType::U8,
42 NonZeroU8: DataModelType::U8,
43 i8: DataModelType::I8,
44 NonZeroI8: DataModelType::I8,
45 bool: DataModelType::Bool,
46 f32: DataModelType::F32,
47 f64: DataModelType::F64,
48 char: DataModelType::Char,
49 str: DataModelType::String,
50 (): DataModelType::Unit,
51 i16: DataModelType::I16, i32: DataModelType::I32, i64: DataModelType::I64, i128: DataModelType::I128,
52 u16: DataModelType::U16, u32: DataModelType::U32, u64: DataModelType::U64, u128: DataModelType::U128,
53 NonZeroI16: DataModelType::I16, NonZeroI32: DataModelType::I32,
54 NonZeroI64: DataModelType::I64, NonZeroI128: DataModelType::I128,
55 NonZeroU16: DataModelType::U16, NonZeroU32: DataModelType::U32,
56 NonZeroU64: DataModelType::U64, NonZeroU128: DataModelType::U128
57];
58
59impl_schema!(tuple => [
60 (A),
61 (A, B),
62 (A, B, C),
63 (A, B, C, D),
64 (A, B, C, D, E),
65 (A, B, C, D, E, F)
66]);
67
68impl<T: Schema> Schema for Option<T> {
69 const SCHEMA: &'static NamedType = &NamedType {
70 name: "Option<T>",
71 ty: &DataModelType::Option(T::SCHEMA),
72 };
73}
74impl<T: Schema, E: Schema> Schema for Result<T, E> {
75 const SCHEMA: &'static NamedType = &NamedType {
76 name: "Result<T, E>",
77 ty: &DataModelType::Enum(&[
78 &NamedVariant {
79 name: "Ok",
80 ty: &DataModelVariant::TupleVariant(&[T::SCHEMA]),
81 },
82 &NamedVariant {
83 name: "Err",
84 ty: &DataModelVariant::TupleVariant(&[E::SCHEMA]),
85 },
86 ]),
87 };
88}
89
90impl<T: Schema + ?Sized> Schema for &'_ T {
91 const SCHEMA: &'static NamedType = T::SCHEMA;
92}
93
94impl<T: Schema> Schema for [T] {
95 const SCHEMA: &'static NamedType = &NamedType {
96 name: "[T]",
97 ty: &DataModelType::Seq(T::SCHEMA),
98 };
99}
100impl<T: Schema, const N: usize> Schema for [T; N] {
101 const SCHEMA: &'static NamedType = &NamedType {
102 name: "[T; N]",
103 ty: &DataModelType::Tuple(&[T::SCHEMA; N]),
104 };
105}
106
107impl<T: Schema> Schema for Range<T> {
108 const SCHEMA: &'static crate::schema::NamedType = &NamedType {
109 name: "Range<T>",
110 ty: &DataModelType::Struct(&[
111 &NamedValue {
112 name: "start",
113 ty: T::SCHEMA,
114 },
115 &NamedValue {
116 name: "end",
117 ty: T::SCHEMA,
118 },
119 ]),
120 };
121}
122
123impl<T: Schema> Schema for RangeInclusive<T> {
124 const SCHEMA: &'static crate::schema::NamedType = &NamedType {
125 name: "RangeInclusive<T>",
126 ty: &DataModelType::Struct(&[
127 &NamedValue {
128 name: "start",
129 ty: T::SCHEMA,
130 },
131 &NamedValue {
132 name: "end",
133 ty: T::SCHEMA,
134 },
135 ]),
136 };
137}
138
139impl<T: Schema> Schema for RangeFrom<T> {
140 const SCHEMA: &'static crate::schema::NamedType = &NamedType {
141 name: "RangeFrom<T>",
142 ty: &DataModelType::Struct(&[&NamedValue {
143 name: "start",
144 ty: T::SCHEMA,
145 }]),
146 };
147}
148
149impl<T: Schema> Schema for RangeTo<T> {
150 const SCHEMA: &'static crate::schema::NamedType = &NamedType {
151 name: "RangeTo<T>",
152 ty: &DataModelType::Struct(&[&NamedValue {
153 name: "end",
154 ty: T::SCHEMA,
155 }]),
156 };
157}