whisky_common/data/primitives/
tuple.rs1use serde_json::{json, Value};
2
3use crate::data::PlutusDataJson;
4
5#[derive(Clone, Debug)]
6pub struct Tuple<T>
7where
8 T: Clone + PlutusDataJson,
9{
10 pub items: T,
11}
12
13impl<T> Tuple<T>
14where
15 T: Clone + PlutusDataJson,
16{
17 pub fn new(items: T) -> Self {
18 Tuple { items }
19 }
20}
21
22impl<T> PlutusDataJson for Tuple<T>
23where
24 T: Clone + PlutusDataJson,
25{
26 fn to_json(&self) -> Value {
27 let items_json = self.items.to_constr_field();
28 tuple(items_json)
29 }
30}
31
32pub fn tuple<T: Into<Value>>(p_tuple: Vec<T>) -> Value {
33 let list: Vec<Value> = p_tuple.into_iter().map(|item| item.into()).collect();
34 json!({ "list": list })
35}
36
37#[macro_export]
38macro_rules! impl_plutus_data_tuple {
39 ( $( $name:ident )+ ) => {
40 #[allow(non_snake_case)]
41 impl<$($name,)+> PlutusDataJson for ($($name,)+)
42 where
43 $($name: PlutusDataJson + Clone,)+
44 {
45 fn to_json(&self) -> Value {
46 json!(self.to_constr_field())
47 }
48 fn to_constr_field(&self) -> Vec<Value> {
49 let ($($name,)+) = self.clone();
50 vec![$($name.to_json(),)+]
51 }
52 }
53 }
54}
55
56impl_plutus_data_tuple!(T1 T2);
57impl_plutus_data_tuple!(T1 T2 T3);
58impl_plutus_data_tuple!(T1 T2 T3 T4);
59impl_plutus_data_tuple!(T1 T2 T3 T4 T5);