taubyte_sdk/http/event/
query.rs

1use super::{imports, Event, EventQueries};
2use crate::errno::Error;
3use crate::utils::codec;
4
5impl Event {
6    pub fn queries(&self) -> EventQueries {
7        EventQueries {
8            event: (self.event),
9        }
10    }
11}
12
13impl EventQueries {
14    fn query_value_by_name_size_unsafe(&self, size: *mut usize, key: &str) -> Error {
15        #[allow(unused_unsafe)]
16        unsafe {
17            imports::getHttpEventQueryValueByNameSize(self.event, size, key.as_ptr(), key.len())
18        }
19    }
20
21    fn query_value_by_name_unsafe(&self, key: &str, buf_ptr: *mut u8, buf_size: usize) -> Error {
22        #[allow(unused_unsafe)]
23        unsafe {
24            imports::getHttpEventQueryValueByName(
25                self.event,
26                key.as_ptr(),
27                key.len(),
28                buf_ptr,
29                buf_size,
30            )
31        }
32    }
33
34    pub fn get(&self, key: &str) -> Result<String, Box<dyn std::error::Error>> {
35        let mut size: usize = 0;
36        let err0 = self.query_value_by_name_size_unsafe(&mut size, key);
37        if err0.is_err() {
38            return Err(format!(
39                "Getting HTTP query size for key: `{}` failed with: {}",
40                key, err0
41            )
42            .into());
43        }
44        if size == 0 {
45            return Ok(String::new());
46        }
47
48        let mut buf = vec![0u8; size];
49        let err0 = self.query_value_by_name_unsafe(key, buf.as_mut_ptr(), size);
50        if err0.is_err() {
51            Err(format!(
52                "Getting HTTP query for key: `{}` failed with: {}",
53                key, err0
54            )
55            .into())
56        } else {
57            Ok(String::from_utf8(buf)?)
58        }
59    }
60
61    fn query_keys_size_unsafe(&self, size: *mut usize) -> Error {
62        #[allow(unused_unsafe)]
63        unsafe {
64            imports::getHttpEventRequestQueryKeysSize(self.event, size)
65        }
66    }
67
68    fn query_keys_unsafe(&self, buf_ptr: *mut u8) -> Error {
69        #[allow(unused_unsafe)]
70        unsafe {
71            imports::getHttpEventRequestQueryKeys(self.event, buf_ptr)
72        }
73    }
74
75    pub fn list(&self) -> Result<Vec<String>, Box<dyn std::error::Error>> {
76        let mut size: usize = 0;
77        let err0 = self.query_keys_size_unsafe(&mut size);
78        if err0.is_err() {
79            return Err(format!("Getting all query keys size failed with: {}", err0).into());
80        }
81        if size == 0 {
82            return Ok(Vec::new());
83        }
84
85        let mut buf = vec![0u8; size];
86        let err0 = self.query_keys_unsafe(buf.as_mut_ptr());
87        if err0.is_err() {
88            Err(format!("Getting all query keys failed with: {}", err0).into())
89        } else {
90            Ok(codec::string_slice::to(buf))
91        }
92    }
93}
94
95#[cfg(test)]
96pub mod test {
97    use crate::http::Event;
98    pub static EXPECTED_ID: u32 = 0;
99    pub static EXPECTED_QUERY_KEY: &str = "query1";
100    pub static EXPECTED_QUERY_VALUE: &str = "value1";
101    pub static EXPECTED_QUERY_KEYS: [&str; 2] = ["query1", "query2"];
102
103    #[test]
104    fn test_get() {
105        let http: Event = Event {
106            event: (EXPECTED_ID),
107        };
108
109        let queries = http.queries();
110        let query = queries.get(EXPECTED_QUERY_KEY).unwrap();
111        assert_eq!(query, EXPECTED_QUERY_VALUE);
112    }
113
114    #[test]
115    fn test_list() {
116        let http: Event = Event {
117            event: (EXPECTED_ID),
118        };
119
120        let queries = http.queries();
121        let query = queries.list().unwrap();
122
123        assert_eq!(query.len(), EXPECTED_QUERY_KEYS.len());
124        for i in 0..EXPECTED_QUERY_KEYS.len() {
125            assert_eq!(query[i], EXPECTED_QUERY_KEYS[i]);
126        }
127    }
128}