cardano_serialization_lib/builders/script_structs/
plutus_witnesses.rs

1use crate::*;
2
3#[wasm_bindgen]
4#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
5pub struct PlutusWitnesses(pub(crate) Vec<PlutusWitness>);
6
7#[wasm_bindgen]
8impl PlutusWitnesses {
9    pub fn new() -> Self {
10        Self(Vec::new())
11    }
12
13    pub fn len(&self) -> usize {
14        self.0.len()
15    }
16
17    pub fn get(&self, index: usize) -> PlutusWitness {
18        self.0[index].clone()
19    }
20
21    pub fn add(&mut self, elem: &PlutusWitness) {
22        self.0.push(elem.clone());
23    }
24
25    pub(crate) fn collect(&self) -> (PlutusScripts, Option<PlutusList>, Redeemers) {
26        let mut used_scripts = BTreeSet::new();
27        let mut used_datums = BTreeSet::new();
28        let mut used_redeemers = BTreeSet::new();
29        let mut s = PlutusScripts::new();
30        let mut d: Option<PlutusList> = None;
31        let mut r = Redeemers::new();
32        self.0.iter().for_each(|w| {
33            if let PlutusScriptSourceEnum::Script(script, ..) = &w.script {
34                if used_scripts.insert(script.clone()) {
35                    s.add(script);
36                }
37            }
38            if let Some(DatumSourceEnum::Datum(datum)) = &w.datum {
39                if used_datums.insert(datum) {
40                    match d {
41                        Some(ref mut d) => d.add(datum),
42                        None => {
43                            d = {
44                                let mut initial_list = PlutusList::new();
45                                initial_list.add(datum);
46                                Some(initial_list)
47                            }
48                        }
49                    }
50                }
51            }
52            if used_redeemers.insert(w.redeemer.clone()) {
53                r.add(&w.redeemer);
54            }
55        });
56        (s, d, r)
57    }
58}
59
60impl From<Vec<PlutusWitness>> for PlutusWitnesses {
61    fn from(scripts: Vec<PlutusWitness>) -> Self {
62        Self(scripts)
63    }
64}