1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use routing::{AccountInfo, MessageId};
use rust_sodium::crypto::sign;
use std::collections::BTreeSet;
#[cfg(not(feature = "use-mock-crust"))]
pub const DEFAULT_MAX_OPS_COUNT: u64 = 500;
#[cfg(feature = "use-mock-crust")]
pub const DEFAULT_MAX_OPS_COUNT: u64 = 100;
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug, Clone)]
pub struct Account {
pub data_ops_msg_ids: BTreeSet<MessageId>,
pub keys_ops_count: u64,
pub keys: BTreeSet<sign::PublicKey>,
}
impl Account {
pub fn balance(&self) -> AccountInfo {
let done = self.data_ops_msg_ids.len() as u64 + self.keys_ops_count;
let available = DEFAULT_MAX_OPS_COUNT.saturating_sub(done);
AccountInfo {
mutations_done: done,
mutations_available: available,
}
}
pub fn has_balance(&self) -> bool {
self.data_ops_msg_ids.len() as u64 + self.keys_ops_count < DEFAULT_MAX_OPS_COUNT
}
}
impl Default for Account {
fn default() -> Self {
Account {
data_ops_msg_ids: BTreeSet::new(),
keys_ops_count: 0,
keys: BTreeSet::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::{Account, DEFAULT_MAX_OPS_COUNT};
use routing::MessageId;
#[test]
fn balance() {
let mut account = Account::default();
assert!(account.has_balance());
account.keys_ops_count = DEFAULT_MAX_OPS_COUNT - 1;
assert!(account.has_balance());
let _ = account.data_ops_msg_ids.insert(MessageId::zero());
assert!(!account.has_balance());
}
}