waves_rust/model/
state_changes.rs

1use crate::error::{Error, Result};
2use crate::model::data_entry::DataEntry;
3use crate::model::{
4    ActionError, BurnAction, InvokeAction, IssueAction, LeaseInfo, ReissueAction, ScriptTransfer,
5    SponsorFeeAction,
6};
7use crate::util::JsonDeserializer;
8use serde_json::Value;
9
10#[derive(Clone, Eq, PartialEq, Debug)]
11pub struct StateChanges {
12    data: Vec<DataEntry>,
13    transfers: Vec<ScriptTransfer>,
14    issues: Vec<IssueAction>,
15    reissues: Vec<ReissueAction>,
16    burns: Vec<BurnAction>,
17    sponsor_fees: Vec<SponsorFeeAction>,
18    leases: Vec<LeaseInfo>,
19    lease_cancels: Vec<LeaseInfo>,
20    invokes: Vec<InvokeAction>,
21    error: Option<ActionError>,
22}
23
24#[allow(clippy::too_many_arguments)]
25impl StateChanges {
26    pub fn new(
27        data: Vec<DataEntry>,
28        transfers: Vec<ScriptTransfer>,
29        issues: Vec<IssueAction>,
30        reissues: Vec<ReissueAction>,
31        burns: Vec<BurnAction>,
32        sponsor_fees: Vec<SponsorFeeAction>,
33        leases: Vec<LeaseInfo>,
34        lease_cancels: Vec<LeaseInfo>,
35        invokes: Vec<InvokeAction>,
36        error: Option<ActionError>,
37    ) -> StateChanges {
38        StateChanges {
39            data,
40            transfers,
41            issues,
42            reissues,
43            burns,
44            sponsor_fees,
45            leases,
46            lease_cancels,
47            invokes,
48            error,
49        }
50    }
51
52    pub fn data(&self) -> Vec<DataEntry> {
53        self.data.clone()
54    }
55
56    pub fn transfers(&self) -> Vec<ScriptTransfer> {
57        self.transfers.clone()
58    }
59
60    pub fn issues(&self) -> Vec<IssueAction> {
61        self.issues.clone()
62    }
63
64    pub fn reissues(&self) -> Vec<ReissueAction> {
65        self.reissues.clone()
66    }
67
68    pub fn burns(&self) -> Vec<BurnAction> {
69        self.burns.clone()
70    }
71
72    pub fn sponsor_fees(&self) -> Vec<SponsorFeeAction> {
73        self.sponsor_fees.clone()
74    }
75
76    pub fn leases(&self) -> Vec<LeaseInfo> {
77        self.leases.clone()
78    }
79
80    pub fn lease_cancels(&self) -> Vec<LeaseInfo> {
81        self.lease_cancels.clone()
82    }
83
84    pub fn invokes(&self) -> Vec<InvokeAction> {
85        self.invokes.clone()
86    }
87
88    pub fn error(&self) -> Option<ActionError> {
89        self.error.clone()
90    }
91}
92
93impl TryFrom<&Value> for StateChanges {
94    type Error = Error;
95
96    fn try_from(value: &Value) -> Result<Self> {
97        let data: Vec<DataEntry> = JsonDeserializer::safe_to_array_from_field(value, "data")?
98            .iter()
99            .map(|item| item.try_into())
100            .collect::<Result<Vec<DataEntry>>>()?;
101        let transfers: Vec<ScriptTransfer> =
102            JsonDeserializer::safe_to_array_from_field(value, "transfers")?
103                .iter()
104                .map(|item| item.try_into())
105                .collect::<Result<Vec<ScriptTransfer>>>()?;
106        let issues: Vec<IssueAction> = JsonDeserializer::safe_to_array_from_field(value, "issues")?
107            .iter()
108            .map(|item| item.try_into())
109            .collect::<Result<Vec<IssueAction>>>()?;
110        let reissues: Vec<ReissueAction> =
111            JsonDeserializer::safe_to_array_from_field(value, "reissues")?
112                .iter()
113                .map(|item| item.try_into())
114                .collect::<Result<Vec<ReissueAction>>>()?;
115        let burns: Vec<BurnAction> = JsonDeserializer::safe_to_array_from_field(value, "burns")?
116            .iter()
117            .map(|item| item.try_into())
118            .collect::<Result<Vec<BurnAction>>>()?;
119        let sponsor_fees: Vec<SponsorFeeAction> =
120            JsonDeserializer::safe_to_array_from_field(value, "sponsorFees")?
121                .iter()
122                .map(|item| item.try_into())
123                .collect::<Result<Vec<SponsorFeeAction>>>()?;
124        let leases: Vec<LeaseInfo> = JsonDeserializer::safe_to_array_from_field(value, "leases")?
125            .iter()
126            .map(|item| item.try_into())
127            .collect::<Result<Vec<LeaseInfo>>>()?;
128        let lease_cancels: Vec<LeaseInfo> =
129            JsonDeserializer::safe_to_array_from_field(value, "leaseCancels")?
130                .iter()
131                .map(|item| item.try_into())
132                .collect::<Result<Vec<LeaseInfo>>>()?;
133        let invokes: Vec<InvokeAction> =
134            JsonDeserializer::safe_to_array_from_field(value, "invokes")?
135                .iter()
136                .map(|item| item.try_into())
137                .collect::<Result<Vec<InvokeAction>>>()?;
138        let error = match value["error"]["code"].as_i64() {
139            Some(code) => {
140                let text = JsonDeserializer::safe_to_string_from_field(&value["error"], "text")?;
141                Some(ActionError::new(code as u32, text))
142            }
143            None => None,
144        };
145        Ok(StateChanges {
146            data,
147            transfers,
148            issues,
149            reissues,
150            burns,
151            sponsor_fees,
152            leases,
153            lease_cancels,
154            invokes,
155            error,
156        })
157    }
158}