taubyte_sdk/database/
list.rs

1use super::{imports, Database};
2use crate::{errno::Error, utils::codec};
3
4impl Database {
5    fn list_size_unsafe(&self, key: &str, size: *mut usize) -> Error {
6        #[allow(unused_unsafe)]
7        unsafe {
8            imports::databaseListSize(self.id, key.as_ptr(), key.len(), size)
9        }
10    }
11
12    fn list_unsafe(&self, key: &str, buf_ptr: *mut u8) -> Error {
13        #[allow(unused_unsafe)]
14        unsafe {
15            imports::databaseList(self.id, key.as_ptr(), key.len(), buf_ptr)
16        }
17    }
18
19    pub fn list(&self, key: &str) -> Result<Vec<String>, Box<dyn std::error::Error>> {
20        let mut size: usize = 0;
21        let err0 = self.list_size_unsafe(key, &mut size);
22        if err0.is_err() {
23            return Err(format!(
24                "Getting database size for key: `{}` failed with: {}",
25                key, err0
26            )
27            .into());
28        }
29        if size == 0 {
30            return Ok(Vec::new());
31        }
32
33        let mut buf = vec![0u8; size];
34        let err0 = self.list_unsafe(key, buf.as_mut_ptr());
35        if err0.is_err() {
36            Err(format!("Getting database for key: `{}` failed with: {}", key, err0).into())
37        } else {
38            Ok(codec::string_slice::to(buf))
39        }
40    }
41}
42
43#[cfg(test)]
44pub mod test {
45    use crate::database::{new::test, Database};
46
47    pub static KEY: &str = "/test/v1";
48    pub static SUB_KEYS: [&str; 2] = ["a", "b"];
49
50    #[test]
51    fn test_list() {
52        let database = Database::new(test::DATABASE_NAME).unwrap_or_else(|err| {
53            panic!("{}", err);
54        });
55
56        let value = database.list(KEY).unwrap_or_else(|err| {
57            panic!("{}", err);
58        });
59
60        assert_eq!(value, SUB_KEYS)
61    }
62}
63
64#[cfg(test)]
65#[allow(non_snake_case)]
66pub mod mock {
67    use super::test;
68    use crate::{
69        database::new::test as new_test,
70        errno::{Errno, Error},
71        utils::test as utils,
72    };
73
74    pub fn databaseList(id: u32, key_ptr: *const u8, key_size: usize, data: *mut u8) -> Error {
75        let key = utils::read_string(key_ptr, key_size);
76
77        if id != new_test::DATABASE_ID {
78            Errno::ErrorCap.error()
79        } else if key != test::KEY {
80            Errno::ErrorCap.error()
81        } else {
82            utils::write_string_slice(data, &test::SUB_KEYS);
83            Errno::ErrorNone.error()
84        }
85    }
86
87    pub fn databaseListSize(
88        id: u32,
89        key_ptr: *const u8,
90        key_size: usize,
91        size: *mut usize,
92    ) -> Error {
93        let key = utils::read_string(key_ptr, key_size);
94
95        if id != new_test::DATABASE_ID {
96            Errno::ErrorCap.error()
97        } else if key != test::KEY {
98            Errno::ErrorCap.error()
99        } else {
100            utils::write_string_slice_size(size, &test::SUB_KEYS);
101            Errno::ErrorNone.error()
102        }
103    }
104}