whisky_pallas/wrapper/transaction_body/
multiasset.rs

1use std::{collections::BTreeMap, str::FromStr};
2
3use pallas::{
4    codec::utils::{NonZeroInt, PositiveCoin},
5    ledger::primitives::{conway::Multiasset as PallasMultiasset, AssetName, PolicyId},
6};
7use whisky_common::WError;
8
9#[derive(Debug, PartialEq, Clone)]
10pub struct MultiassetPositiveCoin {
11    pub inner: PallasMultiasset<PositiveCoin>,
12}
13
14impl MultiassetPositiveCoin {
15    pub fn new(multiasset: Vec<(String, Vec<(String, u64)>)>) -> Result<Self, WError> {
16        let mut policy_map: BTreeMap<PolicyId, BTreeMap<AssetName, PositiveCoin>> = BTreeMap::new();
17
18        for (policy_id_str, assets) in multiasset {
19            let policy_id = PolicyId::from_str(&policy_id_str)
20                .map_err(|_| WError::new("MultiassetPositiveCoin::new", "Invalid PolicyId"))?;
21
22            let mut asset_map: BTreeMap<AssetName, PositiveCoin> = BTreeMap::new();
23            for (asset_name_str, amount) in assets {
24                let asset_name = AssetName::from_str(&asset_name_str)
25                    .map_err(|_| WError::new("MultiassetPositiveCoin::new", "Invalid AssetName"))?;
26                asset_map.insert(
27                    asset_name,
28                    PositiveCoin::try_from(amount).map_err(|_| {
29                        WError::new("MultiassetPositiveCoin::new", "Invalid amount")
30                    })?,
31                );
32            }
33
34            policy_map.insert(policy_id, asset_map);
35        }
36        Ok(MultiassetPositiveCoin { inner: policy_map })
37    }
38}
39
40#[derive(Debug, PartialEq, Clone)]
41pub struct MultiassetNonZeroInt {
42    pub inner: PallasMultiasset<NonZeroInt>,
43}
44
45impl MultiassetNonZeroInt {
46    pub fn new(multiasset: Vec<(String, Vec<(String, i64)>)>) -> Result<Self, WError> {
47        let mut policy_map: BTreeMap<PolicyId, BTreeMap<AssetName, NonZeroInt>> = BTreeMap::new();
48
49        for (policy_id_str, assets) in multiasset {
50            let policy_id = PolicyId::from_str(&policy_id_str).map_err(|_| {
51                WError::new("WhiskyPallas - MultiassetNonZeroInt", "Invalid PolicyId")
52            })?;
53
54            let mut asset_map: BTreeMap<AssetName, NonZeroInt> = BTreeMap::new();
55            for (asset_name_str, amount) in assets {
56                let asset_name = AssetName::from_str(&asset_name_str).map_err(|_| {
57                    WError::new("WhiskyPallas - MultiassetNonZeroInt", "Invalid AssetName")
58                })?;
59                asset_map.insert(
60                    asset_name,
61                    NonZeroInt::try_from(amount).map_err(|_| {
62                        WError::new("WhiskyPallas - MultiassetNonZeroInt", "Invalid amount")
63                    })?,
64                );
65            }
66
67            policy_map.insert(policy_id, asset_map);
68        }
69        Ok(MultiassetNonZeroInt { inner: policy_map })
70    }
71}