odra_schema/
ty.rs

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
10/// Trait for types that can be represented as a NamedCLType.
11pub trait NamedCLTyped {
12    /// Returns the NamedCLType of the implementing type.
13    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}