1use std::collections::BTreeMap;
2
3pub use casper_contract_schema;
4use casper_contract_schema::NamedCLType;
5use casper_types::contracts::ContractHash;
6use casper_types::{bytesrepr::Bytes, Key, PublicKey, URef, U128, U256, U512};
7use odra_core::args::Maybe;
8use odra_core::prelude::*;
9
10pub trait NamedCLTyped {
12 fn ty() -> NamedCLType;
14}
15
16impl NamedCLTyped for bool {
17 fn ty() -> NamedCLType {
18 NamedCLType::Bool
19 }
20}
21
22impl NamedCLTyped for i32 {
23 fn ty() -> NamedCLType {
24 NamedCLType::I32
25 }
26}
27
28impl NamedCLTyped for i64 {
29 fn ty() -> NamedCLType {
30 NamedCLType::I64
31 }
32}
33
34impl NamedCLTyped for u8 {
35 fn ty() -> NamedCLType {
36 NamedCLType::U8
37 }
38}
39
40impl NamedCLTyped for u32 {
41 fn ty() -> NamedCLType {
42 NamedCLType::U32
43 }
44}
45
46impl NamedCLTyped for u64 {
47 fn ty() -> NamedCLType {
48 NamedCLType::U64
49 }
50}
51
52impl NamedCLTyped for U128 {
53 fn ty() -> NamedCLType {
54 NamedCLType::U128
55 }
56}
57
58impl NamedCLTyped for U256 {
59 fn ty() -> NamedCLType {
60 NamedCLType::U256
61 }
62}
63
64impl NamedCLTyped for U512 {
65 fn ty() -> NamedCLType {
66 NamedCLType::U512
67 }
68}
69
70impl NamedCLTyped for () {
71 fn ty() -> NamedCLType {
72 NamedCLType::Unit
73 }
74}
75
76impl NamedCLTyped for String {
77 fn ty() -> NamedCLType {
78 NamedCLType::String
79 }
80}
81
82impl NamedCLTyped for &str {
83 fn ty() -> NamedCLType {
84 NamedCLType::String
85 }
86}
87
88impl NamedCLTyped for Key {
89 fn ty() -> NamedCLType {
90 NamedCLType::Key
91 }
92}
93
94impl NamedCLTyped for URef {
95 fn ty() -> NamedCLType {
96 NamedCLType::URef
97 }
98}
99
100impl NamedCLTyped for Bytes {
101 fn ty() -> NamedCLType {
102 <Vec<u8> as NamedCLTyped>::ty()
103 }
104}
105
106impl<T: NamedCLTyped> NamedCLTyped for Option<T> {
107 fn ty() -> NamedCLType {
108 NamedCLType::Option(Box::new(T::ty()))
109 }
110}
111
112impl<T: NamedCLTyped> NamedCLTyped for Vec<T> {
113 fn ty() -> NamedCLType {
114 NamedCLType::List(Box::new(T::ty()))
115 }
116}
117
118impl<const COUNT: usize> NamedCLTyped for [u8; COUNT] {
119 fn ty() -> NamedCLType {
120 NamedCLType::ByteArray(COUNT as u32)
121 }
122}
123
124impl<T: NamedCLTyped, E: NamedCLTyped> NamedCLTyped for Result<T, E> {
125 fn ty() -> NamedCLType {
126 let ok = Box::new(T::ty());
127 let err = Box::new(E::ty());
128 NamedCLType::Result { ok, err }
129 }
130}
131
132impl<K: NamedCLTyped, V: NamedCLTyped> NamedCLTyped for BTreeMap<K, V> {
133 fn ty() -> NamedCLType {
134 let key = Box::new(K::ty());
135 let value = Box::new(V::ty());
136 NamedCLType::Map { key, value }
137 }
138}
139
140impl<T1: NamedCLTyped> NamedCLTyped for (T1,) {
141 fn ty() -> NamedCLType {
142 NamedCLType::Tuple1([Box::new(T1::ty())])
143 }
144}
145
146impl<T1: NamedCLTyped, T2: NamedCLTyped> NamedCLTyped for (T1, T2) {
147 fn ty() -> NamedCLType {
148 NamedCLType::Tuple2([Box::new(T1::ty()), Box::new(T2::ty())])
149 }
150}
151
152impl<T1: NamedCLTyped, T2: NamedCLTyped, T3: NamedCLTyped> NamedCLTyped for (T1, T2, T3) {
153 fn ty() -> NamedCLType {
154 NamedCLType::Tuple3([Box::new(T1::ty()), Box::new(T2::ty()), Box::new(T3::ty())])
155 }
156}
157
158impl NamedCLTyped for PublicKey {
159 fn ty() -> NamedCLType {
160 NamedCLType::PublicKey
161 }
162}
163
164impl NamedCLTyped for ContractHash {
165 fn ty() -> NamedCLType {
166 NamedCLType::ByteArray(32)
167 }
168}
169
170impl NamedCLTyped for Address {
171 fn ty() -> NamedCLType {
172 NamedCLType::Key
173 }
174}
175
176impl<T: NamedCLTyped> NamedCLTyped for Maybe<T> {
177 fn ty() -> NamedCLType {
178 T::ty()
179 }
180}
181
182#[cfg(test)]
183mod test {
184 use super::*;
185
186 #[test]
187 fn test_named_cl_type() {
188 assert_eq!(bool::ty(), NamedCLType::Bool);
189 assert_eq!(i32::ty(), NamedCLType::I32);
190 assert_eq!(i64::ty(), NamedCLType::I64);
191 assert_eq!(u8::ty(), NamedCLType::U8);
192 assert_eq!(u32::ty(), NamedCLType::U32);
193 assert_eq!(u64::ty(), NamedCLType::U64);
194 assert_eq!(U128::ty(), NamedCLType::U128);
195 assert_eq!(U256::ty(), NamedCLType::U256);
196 assert_eq!(U512::ty(), NamedCLType::U512);
197 assert_eq!(<() as NamedCLTyped>::ty(), NamedCLType::Unit);
198 assert_eq!(String::ty(), NamedCLType::String);
199 assert_eq!(Key::ty(), NamedCLType::Key);
200 assert_eq!(URef::ty(), NamedCLType::URef);
201 assert_eq!(PublicKey::ty(), NamedCLType::PublicKey);
202 assert_eq!(<&str as NamedCLTyped>::ty(), NamedCLType::String);
203 assert_eq!(Bytes::ty(), NamedCLType::List(Box::new(NamedCLType::U8)));
204 assert_eq!(
205 Option::<u32>::ty(),
206 NamedCLType::Option(Box::new(NamedCLType::U32))
207 );
208 assert_eq!(
209 Vec::<u32>::ty(),
210 NamedCLType::List(Box::new(NamedCLType::U32))
211 );
212 assert_eq!(<[u8; 32] as NamedCLTyped>::ty(), NamedCLType::ByteArray(32));
213 assert_eq!(
214 Result::<u32, u64>::ty(),
215 NamedCLType::Result {
216 ok: Box::new(NamedCLType::U32),
217 err: Box::new(NamedCLType::U64)
218 }
219 );
220 assert_eq!(
221 BTreeMap::<u32, u64>::ty(),
222 NamedCLType::Map {
223 key: Box::new(NamedCLType::U32),
224 value: Box::new(NamedCLType::U64)
225 }
226 );
227 assert_eq!(
228 <(u32,) as NamedCLTyped>::ty(),
229 NamedCLType::Tuple1([Box::new(NamedCLType::U32)])
230 );
231 assert_eq!(
232 <(u32, u64) as NamedCLTyped>::ty(),
233 NamedCLType::Tuple2([Box::new(NamedCLType::U32), Box::new(NamedCLType::U64)])
234 );
235 assert_eq!(
236 <(u32, u64, u8) as NamedCLTyped>::ty(),
237 NamedCLType::Tuple3([
238 Box::new(NamedCLType::U32),
239 Box::new(NamedCLType::U64),
240 Box::new(NamedCLType::U8)
241 ])
242 );
243 }
244}