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 ($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 ($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 ($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 ($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}