hpl_toolkit/schema/
default_impl.rs1use 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}