hpl_toolkit/schema/
default_impl.rs

1use super::{Number, Schema, SchemaValue, ToSchema};
2use crate::utils::VecMap;
3use anchor_lang::prelude::*;
4use std::collections::HashMap;
5
6macro_rules! impl_to_schema_for_unsigned {
7    ($($t:ty)+) => {
8        $(
9            impl ToSchema for $t {
10                fn schema() -> Schema {
11                    Schema::Number
12                }
13
14                fn schema_value(&self) -> SchemaValue {
15                    SchemaValue::Number(Number::U64(self.clone().into()))
16                }
17            }
18        )+
19    };
20}
21impl_to_schema_for_unsigned!(u8 u16 u32 u64);
22
23macro_rules! impl_to_schema_for_signed {
24    ($($t:ty)+) => {
25        $(
26            impl ToSchema for $t {
27                fn schema() -> Schema {
28                    Schema::Number
29                }
30
31                fn schema_value(&self) -> SchemaValue {
32                    SchemaValue::Number(Number::I64(self.clone().into()))
33                }
34            }
35        )+
36    };
37}
38impl_to_schema_for_signed!(i8 i16 i32 i64);
39
40macro_rules! impl_to_schema_for_float {
41    ($($t:ty)+) => {
42        $(
43            impl ToSchema for $t {
44                fn schema() -> Schema {
45                    Schema::Number
46                }
47
48                fn schema_value(&self) -> SchemaValue {
49                    SchemaValue::Number(Number::F64(self.clone().into()))
50                }
51            }
52        )+
53    };
54}
55impl_to_schema_for_float!(f32 f64);
56
57macro_rules! impl_to_schema_for_array {
58    ($($n:literal)+) => {
59        $(
60            impl<T: ToSchema> ToSchema for [T; $n] {
61                fn schema() -> Schema {
62                    Schema::Array(Box::new(T::schema()))
63                }
64
65                fn schema_value(&self) -> SchemaValue {
66                    SchemaValue::Array(self.iter().map(|i| i.schema_value()).collect())
67                }
68            }
69        )+
70    };
71}
72impl_to_schema_for_array!(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32);
73
74impl ToSchema for String {
75    fn schema() -> Schema {
76        Schema::String
77    }
78
79    fn schema_value(&self) -> SchemaValue {
80        SchemaValue::String(self.clone().trim_matches(char::from(0)).to_string())
81    }
82}
83
84impl<T: ToSchema> ToSchema for Vec<T> {
85    fn schema() -> Schema {
86        Schema::Array(Box::new(T::schema()))
87    }
88
89    fn schema_value(&self) -> SchemaValue {
90        SchemaValue::Array(self.iter().map(|i| i.schema_value()).collect())
91    }
92}
93
94impl ToSchema for Pubkey {
95    fn schema() -> Schema {
96        Schema::Pubkey
97    }
98
99    fn schema_value(&self) -> SchemaValue {
100        SchemaValue::Pubkey(self.clone())
101    }
102}
103
104impl ToSchema for bool {
105    fn schema() -> Schema {
106        Schema::Bool
107    }
108
109    fn schema_value(&self) -> SchemaValue {
110        SchemaValue::Bool(self.clone())
111    }
112}
113
114impl<T: ToSchema> ToSchema for Option<T> {
115    fn schema() -> Schema {
116        Schema::Option(Box::new(T::schema()))
117    }
118
119    fn schema_value(&self) -> SchemaValue {
120        if self.is_some() {
121            self.as_ref().unwrap().schema_value()
122        } else {
123            SchemaValue::Null
124        }
125    }
126}
127
128impl<K: ToString, V: ToSchema> ToSchema for HashMap<K, V> {
129    fn schema() -> Schema {
130        Schema::VecMap(Box::new(Schema::String), Box::new(V::schema()))
131    }
132
133    fn schema_value(&self) -> SchemaValue {
134        let mut schema = VecMap::new();
135        self.iter().for_each(|(key, value)| {
136            schema.insert(key.to_string().schema_value(), value.schema_value());
137        });
138        SchemaValue::VecMap(schema)
139    }
140}
141
142impl ToSchema for Vec<(String, String)> {
143    fn schema() -> Schema {
144        Schema::Array(Box::new(Schema::Array(Box::new(Schema::String))))
145    }
146
147    fn schema_value(&self) -> SchemaValue {
148        SchemaValue::Array(
149            self.iter()
150                .map(|(key, value)| {
151                    SchemaValue::Array(vec![
152                        SchemaValue::String(key.clone()),
153                        SchemaValue::String(value.clone()),
154                    ])
155                })
156                .collect(),
157        )
158    }
159}