1use crate::{Env, OCamlDesc};
14use const_random::const_random;
15
16extern crate alloc;
17use alloc::format;
18use alloc::string::{String, ToString};
19use alloc::vec::Vec;
20
21impl OCamlDesc for () {
22 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
23 "unit".to_string()
24 }
25
26 fn unique_id() -> u128 {
27 const_random!(u128)
28 }
29}
30
31impl<T> OCamlDesc for &T
32where
33 T: OCamlDesc,
34{
35 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
36 T::ocaml_desc(env, generics)
37 }
38
39 fn unique_id() -> u128 {
40 T::unique_id()
41 }
42}
43
44impl OCamlDesc for u8 {
45 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
46 "char".to_string()
47 }
48
49 fn unique_id() -> u128 {
50 const_random!(u128)
51 }
52}
53
54impl OCamlDesc for [u8; 32] {
55 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
56 "bytes".to_string()
57 }
58
59 fn unique_id() -> u128 {
60 const_random!(u128)
61 }
62}
63
64impl OCamlDesc for &[u8] {
65 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
66 "bytes".to_string()
67 }
68
69 fn unique_id() -> u128 {
70 const_random!(u128)
71 }
72}
73
74impl<T> OCamlDesc for Vec<T>
75where
76 T: OCamlDesc,
77{
78 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
79 format!("({}) array", T::ocaml_desc(env, generics))
80 }
81
82 fn unique_id() -> u128 {
83 const_random!(u128)
84 }
85}
86
87impl<T, E> OCamlDesc for Result<T, E>
88where
89 T: OCamlDesc,
90{
91 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
92 T::ocaml_desc(env, generics)
93 }
94
95 fn unique_id() -> u128 {
96 const_random!(u128)
97 }
98}
99
100impl<T> OCamlDesc for Option<T>
101where
102 T: OCamlDesc,
103{
104 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
105 format!("({}) option", T::ocaml_desc(env, generics))
106 }
107
108 fn unique_id() -> u128 {
109 const_random!(u128)
110 }
111}
112
113impl OCamlDesc for usize {
114 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
115 "int".to_string()
116 }
117
118 fn unique_id() -> u128 {
119 const_random!(u128)
120 }
121}
122
123impl OCamlDesc for ocaml::Int {
124 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
125 "int".to_string()
126 }
127
128 fn unique_id() -> u128 {
129 const_random!(u128)
130 }
131}
132
133impl OCamlDesc for String {
134 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
135 "string".to_string()
136 }
137
138 fn unique_id() -> u128 {
139 const_random!(u128)
140 }
141}
142
143impl OCamlDesc for bool {
144 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
145 "bool".to_string()
146 }
147
148 fn unique_id() -> u128 {
149 const_random!(u128)
150 }
151}
152
153impl OCamlDesc for i32 {
154 fn ocaml_desc(_env: &Env, _generics: &[&str]) -> String {
155 "int32".to_string()
156 }
157
158 fn unique_id() -> u128 {
159 const_random!(u128)
160 }
161}
162
163impl<T> OCamlDesc for ocaml::Pointer<'_, T>
164where
165 T: OCamlDesc,
166{
167 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
168 T::ocaml_desc(env, generics)
169 }
170
171 fn unique_id() -> u128 {
172 const_random!(u128)
173 }
174}
175
176impl<T1, T2> OCamlDesc for (T1, T2)
177where
178 T1: OCamlDesc,
179 T2: OCamlDesc,
180{
181 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
182 let v = [T1::ocaml_desc(env, generics), T2::ocaml_desc(env, generics)];
183 format!("({})", v.join(" * "))
184 }
185
186 fn unique_id() -> u128 {
187 const_random!(u128)
188 }
189}
190
191impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> OCamlDesc
192 for (
193 T1,
194 T2,
195 T3,
196 T4,
197 T5,
198 T6,
199 T7,
200 T8,
201 T9,
202 T10,
203 T11,
204 T12,
205 T13,
206 T14,
207 T15,
208 )
209where
210 T1: OCamlDesc,
211 T2: OCamlDesc,
212 T3: OCamlDesc,
213 T4: OCamlDesc,
214 T5: OCamlDesc,
215 T6: OCamlDesc,
216 T7: OCamlDesc,
217 T8: OCamlDesc,
218 T9: OCamlDesc,
219 T10: OCamlDesc,
220 T11: OCamlDesc,
221 T12: OCamlDesc,
222 T13: OCamlDesc,
223 T14: OCamlDesc,
224 T15: OCamlDesc,
225{
226 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
227 let v = [
228 T1::ocaml_desc(env, generics),
229 T2::ocaml_desc(env, generics),
230 T3::ocaml_desc(env, generics),
231 T4::ocaml_desc(env, generics),
232 T5::ocaml_desc(env, generics),
233 T6::ocaml_desc(env, generics),
234 T7::ocaml_desc(env, generics),
235 T8::ocaml_desc(env, generics),
236 T9::ocaml_desc(env, generics),
237 T10::ocaml_desc(env, generics),
238 T11::ocaml_desc(env, generics),
239 T12::ocaml_desc(env, generics),
240 T13::ocaml_desc(env, generics),
241 T14::ocaml_desc(env, generics),
242 T15::ocaml_desc(env, generics),
243 ];
244 format!("({})", v.join(" * "))
245 }
246
247 fn unique_id() -> u128 {
248 const_random!(u128)
249 }
250}
251
252impl<T1, T2, T3, T4, T5, T6> OCamlDesc for (T1, T2, T3, T4, T5, T6)
253where
254 T1: OCamlDesc,
255 T2: OCamlDesc,
256 T3: OCamlDesc,
257 T4: OCamlDesc,
258 T5: OCamlDesc,
259 T6: OCamlDesc,
260{
261 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
262 let v = [
263 T1::ocaml_desc(env, generics),
264 T2::ocaml_desc(env, generics),
265 T3::ocaml_desc(env, generics),
266 T4::ocaml_desc(env, generics),
267 T5::ocaml_desc(env, generics),
268 T6::ocaml_desc(env, generics),
269 ];
270 format!("({})", v.join(" * "))
271 }
272
273 fn unique_id() -> u128 {
274 const_random!(u128)
275 }
276}
277
278impl<T1, T2, T3, T4, T5, T6, T7> OCamlDesc for (T1, T2, T3, T4, T5, T6, T7)
279where
280 T1: OCamlDesc,
281 T2: OCamlDesc,
282 T3: OCamlDesc,
283 T4: OCamlDesc,
284 T5: OCamlDesc,
285 T6: OCamlDesc,
286 T7: OCamlDesc,
287{
288 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
289 let v = [
290 T1::ocaml_desc(env, generics),
291 T2::ocaml_desc(env, generics),
292 T3::ocaml_desc(env, generics),
293 T4::ocaml_desc(env, generics),
294 T5::ocaml_desc(env, generics),
295 T6::ocaml_desc(env, generics),
296 T7::ocaml_desc(env, generics),
297 ];
298 v.join(" * ")
299 }
300
301 fn unique_id() -> u128 {
302 const_random!(u128)
303 }
304}
305
306impl<T1, T2, T3> OCamlDesc for (T1, T2, T3)
307where
308 T1: OCamlDesc,
309 T2: OCamlDesc,
310 T3: OCamlDesc,
311{
312 fn ocaml_desc(env: &Env, generics: &[&str]) -> String {
313 let v = [
314 T1::ocaml_desc(env, generics),
315 T2::ocaml_desc(env, generics),
316 T3::ocaml_desc(env, generics),
317 ];
318 format!("({})", v.join(" * "))
319 }
320
321 fn unique_id() -> u128 {
322 const_random!(u128)
323 }
324}