waves_rust/model/
state_changes.rs1use 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}