taubyte_sdk/http/event/
query.rs1use 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}