cardano_serialization_lib/builders/script_structs/
plutus_witnesses.rs1use 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}