postcard_schema/impls/
builtins_nostd.rs

1//! Implementations of the [`Schema`] trait for `core` types
2//!
3//! These implementations are always available
4
5use 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}