whisky_pallas/wrapper/transaction_body/
multiasset.rs1use 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}