whisky_common/data/primitives/
tuple.rs

1use 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);