whisky_common/data/
mod.rs

1mod aliases;
2mod credentials;
3mod primitives;
4mod value;
5use std::fmt::Debug;
6
7pub use aliases::*;
8pub use credentials::*;
9pub use primitives::*;
10pub use value::*;
11
12pub trait PlutusDataJson: Clone + Debug {
13    fn to_json(&self) -> serde_json::Value;
14    fn to_json_string(&self) -> String {
15        self.to_json().to_string()
16    }
17    fn to_constr_field(&self) -> Vec<serde_json::Value> {
18        vec![self.to_json()]
19    }
20}
21
22#[derive(Clone, Debug)]
23pub enum PlutusData {
24    Integer(Int),
25    ByteString(ByteString),
26    List(List<PlutusData>),
27    Map(Map<PlutusData, PlutusData>),
28    Bool(Bool),
29    Constr(Constr<Box<PlutusData>>),
30}
31
32impl PlutusDataJson for PlutusData {
33    fn to_json(&self) -> serde_json::Value {
34        match self {
35            PlutusData::Integer(int) => int.to_json(),
36            PlutusData::ByteString(bytes) => bytes.to_json(),
37            PlutusData::List(list) => list.to_json(),
38            PlutusData::Map(map) => map.to_json(),
39            PlutusData::Bool(bool) => bool.to_json(),
40            PlutusData::Constr(constr) => constr.to_json(),
41        }
42    }
43
44    fn to_json_string(&self) -> String {
45        self.to_json().to_string()
46    }
47
48    fn to_constr_field(&self) -> Vec<serde_json::Value> {
49        match self {
50            PlutusData::Integer(int) => vec![int.to_json()],
51            PlutusData::ByteString(bytes) => vec![bytes.to_json()],
52            PlutusData::List(list) => vec![list.to_json()],
53            PlutusData::Map(map) => vec![map.to_json()],
54            PlutusData::Bool(bool) => vec![bool.to_json()],
55            PlutusData::Constr(constr) => constr.fields.to_constr_field(),
56        }
57    }
58}
59
60impl PlutusDataJson for Box<PlutusData> {
61    fn to_json(&self) -> serde_json::Value {
62        let inner = self.as_ref();
63        inner.to_json()
64    }
65
66    fn to_json_string(&self) -> String {
67        self.to_json().to_string()
68    }
69
70    fn to_constr_field(&self) -> Vec<serde_json::Value> {
71        let inner = self.as_ref();
72        match inner {
73            PlutusData::Integer(int) => vec![int.to_json()],
74            PlutusData::ByteString(bytes) => vec![bytes.to_json()],
75            PlutusData::List(list) => vec![list.to_json()],
76            PlutusData::Map(map) => vec![map.to_json()],
77            PlutusData::Bool(bool) => vec![bool.to_json()],
78            PlutusData::Constr(constr) => constr.fields.to_constr_field(),
79        }
80    }
81}
82
83#[macro_export]
84macro_rules! impl_constr_type {
85    // Single parameter case
86    ($name:ident, 0, ($param_name:ident: $param_type:ty, $param_conv:ty)) => {
87        impl $name {
88            pub fn from($param_name: $param_conv) -> Self {
89                Constr0::new(<$param_type>::new($param_name))
90            }
91        }
92    };
93
94    ($name:ident, 1,($param_name:ident: $param_type:ty, $param_conv:ty)) => {
95        impl $name {
96            pub fn from($param_name: $param_conv) -> Self {
97                Constr1::new(<$param_type>::new($param_name))
98            }
99        }
100    };
101
102    ($name:ident, 2,($param_name:ident: $param_type:ty, $param_conv:ty)) => {
103        impl $name {
104            pub fn from($param_name: $param_conv) -> Self {
105                Constr2::new(<$param_type>::new($param_name))
106            }
107        }
108    };
109
110    ($name:ident, $tag:expr, ($param_name:ident: $param_type:ty, $param_conv:ty)) => {
111        impl $name {
112            pub fn from($param_name: $param_conv) -> Self {
113                Constr::new($tag, <$param_type>::new($param_name))
114            }
115        }
116    };
117
118    // Multiple parameters case
119    ($name:ident, 0, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
120        impl $name {
121            pub fn from($($param_name: $param_conv),+) -> Self {
122                Constr0::new(Box::new((
123                    $(<$param_type>::new($param_name),)+
124                )))
125            }
126        }
127    };
128
129    ($name:ident, 1, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
130        impl $name {
131            pub fn from($($param_name: $param_conv),+) -> Self {
132                Constr1::new(Box::new((
133                    $(<$param_type>::new($param_name),)+
134                )))
135            }
136        }
137    };
138
139    ($name:ident, 2, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
140        impl $name {
141            pub fn from($($param_name: $param_conv),+) -> Self {
142                Constr1::new(Box::new((
143                    $(<$param_type>::new($param_name),)+
144                )))
145            }
146        }
147    };
148
149    ($name:ident, $tag:expr, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
150        impl $name {
151            pub fn from($($param_name: $param_conv),+) -> Self {
152                Constr::new($tag, Box::new((
153                    $(<$param_type>::new($param_name),)+
154                )))
155            }
156        }
157    };
158}
159
160#[macro_export]
161macro_rules! impl_constr_wrapper_type {
162    // Single parameter case
163    ($name:ident, 0, ($param_name:ident: $param_type:ty, $param_conv:ty)) => {
164        impl $name {
165            pub fn from($param_name: $param_conv) -> Self {
166                $name(Constr0::new(<$param_type>::new($param_name)))
167            }
168        }
169    };
170
171    ($name:ident, 1,($param_name:ident: $param_type:ty, $param_conv:ty)) => {
172        impl $name {
173            pub fn from($param_name: $param_conv) -> Self {
174                $name(Constr1::new(<$param_type>::new($param_name)))
175            }
176        }
177    };
178
179    ($name:ident, 2,($param_name:ident: $param_type:ty, $param_conv:ty)) => {
180        impl $name {
181            pub fn from($param_name: $param_conv) -> Self {
182                $name(Constr2::new(<$param_type>::new($param_name)))
183            }
184        }
185    };
186
187    ($name:ident, $tag:expr, ($param_name:ident: $param_type:ty, $param_conv:ty)) => {
188        impl $name {
189            pub fn from($param_name: $param_conv) -> Self {
190                $name(Constr::new($tag, <$param_type>::new($param_name)))
191            }
192        }
193    };
194
195    // Multiple parameters case
196    ($name:ident, 0, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
197        impl $name {
198            pub fn from($($param_name: $param_conv),+) -> Self {
199                $name(Constr0::new(Box::new((
200                    $(<$param_type>::new($param_name),)+
201                ))))
202            }
203        }
204    };
205
206    ($name:ident, 1, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
207        impl $name {
208            pub fn from($($param_name: $param_conv),+) -> Self {
209                $name(Constr1::new(Box::new((
210                    $(<$param_type>::new($param_name),)+
211                ))))
212            }
213        }
214    };
215
216    ($name:ident, 2, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
217        impl $name {
218            pub fn from($($param_name: $param_conv),+) -> Self {
219                $name(Constr1::new(Box::new((
220                    $(<$param_type>::new($param_name),)+
221                ))))
222            }
223        }
224    };
225
226    ($name:ident, $tag:expr, [$(($param_name:ident: $param_type:ty, $param_conv:ty)),+ $(,)?]) => {
227        impl $name {
228            pub fn from($($param_name: $param_conv),+) -> Self {
229                $name(Constr::new($tag, Box::new((
230                    $(<$param_type>::new($param_name),)+
231                ))))
232            }
233        }
234    };
235}