waves_rust/model/account/
balance.rs1use serde_json::Value;
2
3use crate::error::{Error, Result};
4use crate::model::account::Address;
5use crate::util::JsonDeserializer;
6
7#[derive(Eq, PartialEq, Clone, Debug)]
8pub struct Balance {
9 address: Address,
10 balance: u64,
11}
12
13impl Balance {
14 pub fn new(address: Address, balance: u64) -> Balance {
15 Balance { address, balance }
16 }
17
18 pub fn address(&self) -> Address {
19 self.address.clone()
20 }
21
22 pub fn balance(&self) -> u64 {
23 self.balance
24 }
25}
26
27impl TryFrom<&Value> for Balance {
28 type Error = Error;
29
30 fn try_from(value: &Value) -> Result<Self> {
31 let address =
32 Address::from_string(&JsonDeserializer::safe_to_string_from_field(value, "id")?)?;
33 let balance = JsonDeserializer::safe_to_int_from_field(value, "balance")?;
34 Ok(Balance::new(address, balance as u64))
35 }
36}
37
38#[derive(Eq, PartialEq, Clone, Debug)]
39pub struct BalanceDetails {
40 address: Address,
41 available: u64,
42 regular: u64,
43 generating: u64,
44 effective: u64,
45}
46
47impl BalanceDetails {
48 pub fn new(
49 address: Address,
50 available: u64,
51 regular: u64,
52 generating: u64,
53 effective: u64,
54 ) -> BalanceDetails {
55 BalanceDetails {
56 address,
57 available,
58 regular,
59 generating,
60 effective,
61 }
62 }
63
64 pub fn address(&self) -> Address {
65 self.address.clone()
66 }
67
68 pub fn available(&self) -> u64 {
69 self.available
70 }
71
72 pub fn regular(&self) -> u64 {
73 self.regular
74 }
75
76 pub fn generating(&self) -> u64 {
77 self.generating
78 }
79
80 pub fn effective(&self) -> u64 {
81 self.effective
82 }
83}
84
85impl TryFrom<&Value> for BalanceDetails {
86 type Error = Error;
87
88 fn try_from(value: &Value) -> Result<Self> {
89 let address = Address::from_string(&JsonDeserializer::safe_to_string_from_field(
90 value, "address",
91 )?)?;
92 let available = JsonDeserializer::safe_to_int_from_field(value, "available")? as u64;
93 let regular = JsonDeserializer::safe_to_int_from_field(value, "regular")? as u64;
94 let generating = JsonDeserializer::safe_to_int_from_field(value, "generating")? as u64;
95 let effective = JsonDeserializer::safe_to_int_from_field(value, "effective")? as u64;
96 Ok(BalanceDetails::new(
97 address, available, regular, generating, effective,
98 ))
99 }
100}
101
102#[cfg(test)]
103mod tests {
104
105 use std::fs;
106
107 use crate::error::Result;
108 use crate::model::{Address, Balance, BalanceDetails, ByteString};
109 use serde_json::{json, Value};
110
111 #[test]
112 fn test_balance_details_from_json() -> Result<()> {
113 let data = fs::read_to_string("./tests/resources/addresses/balance_details_rs.json")
114 .expect("Unable to read file");
115 let json: &Value = &serde_json::from_str(&data).expect("failed to generate json from str");
116 let balance_details: BalanceDetails = json.try_into()?;
117 assert_eq!(
118 "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW",
119 balance_details.address().encoded()
120 );
121 assert_eq!(139400001, balance_details.regular());
122 assert_eq!(139400002, balance_details.generating());
123 assert_eq!(139400003, balance_details.available());
124 assert_eq!(139400004, balance_details.effective());
125 Ok(())
126 }
127
128 #[test]
129 fn test_create_struct_balance_details() -> Result<()> {
130 let balance_details: BalanceDetails = BalanceDetails::new(
131 Address::from_string("3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW")?,
132 139400003,
133 139400001,
134 139400002,
135 139400004,
136 );
137 assert_eq!(
138 "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW",
139 balance_details.address().encoded()
140 );
141 assert_eq!(139400001, balance_details.regular());
142 assert_eq!(139400002, balance_details.generating());
143 assert_eq!(139400003, balance_details.available());
144 assert_eq!(139400004, balance_details.effective());
145 Ok(())
146 }
147
148 #[test]
149 fn test_balance_from_json() -> Result<()> {
150 let json: &Value = &json!({
151 "id": "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW",
152 "balance": 141700000
153 });
154 let balance: Balance = json.try_into()?;
155 assert_eq!(
156 "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW",
157 balance.address().encoded()
158 );
159 assert_eq!(141700000, balance.balance());
160 Ok(())
161 }
162
163 #[test]
164 fn test_create_struct_balance() -> Result<()> {
165 let balance: Balance = Balance::new(
166 Address::from_string("3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW")?,
167 139400003,
168 );
169 assert_eq!(
170 "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW",
171 balance.address().encoded()
172 );
173 assert_eq!(139400003, balance.balance());
174 Ok(())
175 }
176}