ocaml_gen/
conv.rs

1//! Implementations of [`crate::OCamlDesc`] for types
2//! that have natural equivalents in OCaml.
3//!
4//! The OCaml description should be the corresponding data types in OCaml
5//! This should correspond to the mapping defined in the ocaml-rs book:
6//! `<https://github.com/zshipko/ocaml-rs/blob/v1.0.0-beta.4/doc/src/02_type_conversion.md>`
7//!
8//! FIXME:
9//! Unsigned types like uint16, uint32 and uint64 are not implemented as OCaml
10//! does not provide types in the Stdlib for it. A custom block should be used.
11//! Using [Stdint](https://github.com/andrenth/ocaml-stdint/) could be a solution.
12
13use 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}