taubyte_sdk/storage/
capacity.rs1use super::{imports, Storage};
2use crate::errno::Error;
3
4impl Storage {
6 fn used_size_unsafe(&self, size: *mut usize) -> Error {
7 #[allow(unused_unsafe)]
8 unsafe {
9 imports::storageUsedSize(self.id, size)
10 }
11 }
12
13 fn used_unsafe(&self, used: *mut u8) -> Error {
14 #[allow(unused_unsafe)]
15 unsafe {
16 imports::storageUsed(self.id, used)
17 }
18 }
19
20 pub fn used(&self) -> Result<i64, Box<dyn std::error::Error>> {
21 let mut size: usize = 0;
22 let err = self.used_size_unsafe(&mut size);
23 if err.is_err() {
24 Err(format!("Getting storage used size failed with: {}", err).into())
25 } else {
26 let mut used = vec![0; size];
27 let err = self.used_unsafe(used.as_mut_ptr());
28 if err.is_err() {
29 Err(format!("Getting storage used failed with: {}", err).into())
30 } else {
31 let used = String::from_utf8(used)?;
32 let used = used.parse::<i64>()?;
33 Ok(used)
34 }
35 }
36 }
37
38 fn capacity_size_unsafe(&self, size: *mut usize) -> Error {
39 #[allow(unused_unsafe)]
40 unsafe {
41 imports::storageCapacitySize(self.id, size)
42 }
43 }
44
45 fn capacity_unsafe(&self, capacity: *mut u8) -> Error {
46 #[allow(unused_unsafe)]
47 unsafe {
48 imports::storageCapacity(self.id, capacity)
49 }
50 }
51
52 pub fn capacity(&self) -> Result<i64, Box<dyn std::error::Error>> {
53 let mut size: usize = 0;
54 let err = self.capacity_size_unsafe(&mut size);
55 if err.is_err() {
56 Err(format!("Getting storage capacity size failed with: {}", err).into())
57 } else {
58 let mut capacity = vec![0; size];
59 let err = self.capacity_unsafe(capacity.as_mut_ptr());
60 if err.is_err() {
61 Err(format!("Getting storage capacity failed with: {}", err).into())
62 } else {
63 let capacity = String::from_utf8(capacity)?;
64 let capacity = capacity.parse::<i64>()?;
65 Ok(capacity)
66 }
67 }
68 }
69
70 pub fn remaining_capacity(&self) -> Result<i64, Box<dyn std::error::Error>> {
71 let used = self.used()?;
72 let capacity = self.capacity()?;
73 Ok(capacity - used)
74 }
75}
76
77#[cfg(test)]
78pub mod test {
79 use crate::storage::Storage;
80
81 use crate::storage::new::test as new_test;
82 pub static STORAGE_USED: &str = "500";
83 pub static STORAGE_CAPACITY: &str = "1000";
84
85 #[test]
86 fn test_capacity() {
87 let storage = Storage::new(new_test::STORAGE_NAME).unwrap_or_else(|err| {
88 panic!("{}", err);
89 });
90
91 let used = storage.used().unwrap_or_else(|err| {
92 panic!("{}", err);
93 });
94 assert_eq!(used, STORAGE_USED.parse::<i64>().unwrap());
95
96 let capacity = storage.capacity().unwrap_or_else(|err| {
97 panic!("{}", err);
98 });
99 assert_eq!(capacity, STORAGE_CAPACITY.parse::<i64>().unwrap());
100
101 let remaining_capacity = storage.remaining_capacity().unwrap_or_else(|err| {
102 panic!("{}", err);
103 });
104 assert_eq!(remaining_capacity, 500);
105 }
106}
107
108#[cfg(test)]
109#[allow(non_snake_case)]
110pub mod mock {
111 use crate::{
112 errno::{Errno, Error},
113 storage::new::test as new_test,
114 utils::test as utils,
115 };
116
117 pub fn storageUsedSize(id: u32, size: *mut usize) -> Error {
118 use super::test;
119
120 if id != new_test::STORAGE_ID {
121 Errno::ErrorCap.error()
122 } else {
123 utils::write_usize(size, test::STORAGE_USED.len());
124 Errno::ErrorNone.error()
125 }
126 }
127
128 pub fn storageUsed(id: u32, used: *mut u8) -> Error {
129 use super::test;
130
131 if id != new_test::STORAGE_ID {
132 Errno::ErrorCap.error()
133 } else {
134 utils::write_string(used, test::STORAGE_USED);
135 Errno::ErrorNone.error()
136 }
137 }
138
139 pub fn storageCapacitySize(id: u32, size: *mut usize) -> Error {
140 use super::test;
141
142 if id != new_test::STORAGE_ID {
143 Errno::ErrorCap.error()
144 } else {
145 utils::write_usize(size, test::STORAGE_CAPACITY.len());
146 Errno::ErrorNone.error()
147 }
148 }
149
150 pub fn storageCapacity(id: u32, capacity: *mut u8) -> Error {
151 use super::test;
152
153 if id != new_test::STORAGE_ID {
154 Errno::ErrorCap.error()
155 } else {
156 utils::write_string(capacity, test::STORAGE_CAPACITY);
157 Errno::ErrorNone.error()
158 }
159 }
160}