@@ -4,33 +4,25 @@ use crate::{error::Error, Client as SdkClient};
44use base64:: { engine:: general_purpose, Engine as _} ;
55use reqwest:: header:: { HeaderValue , AUTHORIZATION } ;
66use serde:: { Deserialize , Serialize } ;
7+ use serde_with:: { base64:: Base64 , serde_as} ;
78
89/// The JSON payload for a `get` operation response.
10+ #[ serde_as]
911#[ derive( Serialize , Deserialize , Debug ) ]
1012pub struct GetResultPayload {
11- pub value : String ,
12- }
13-
14- /// The result of a `get` operation.
15- #[ derive( Debug ) ]
16- pub struct GetResult {
17- /// The retrieved value.
13+ #[ serde_as( as = "Base64" ) ]
1814 pub value : Vec < u8 > ,
1915}
2016
21- /// An item in the result of a `query` operation. For internal use.
17+ /// An item in the result of a `query` operation.
18+ #[ serde_as]
2219#[ derive( Serialize , Deserialize , Debug ) ]
2320pub struct QueryResultItemPayload {
24- pub key : String ,
25- pub value : String ,
26- }
27-
28- /// An item in the result of a `query` operation.
29- #[ derive( Debug ) ]
30- pub struct QueryResultItem {
3121 /// The key of the item.
32- pub key : String ,
22+ #[ serde_as( as = "Base64" ) ]
23+ pub key : Vec < u8 > ,
3324 /// The value of the item.
25+ #[ serde_as( as = "Base64" ) ]
3426 pub value : Vec < u8 > ,
3527}
3628
@@ -40,13 +32,6 @@ pub struct QueryResultPayload {
4032 pub results : Vec < QueryResultItemPayload > ,
4133}
4234
43- /// The result of a `query` operation.
44- #[ derive( Debug ) ]
45- pub struct QueryResult {
46- /// A list of key-value pairs.
47- pub results : Vec < QueryResultItem > ,
48- }
49-
5035/// A client for interacting with the key-value store.
5136#[ derive( Clone ) ]
5237pub struct Client {
@@ -60,8 +45,9 @@ impl Client {
6045 }
6146
6247 /// Sets a key-value pair in the store.
63- pub async fn set ( & self , key : & str , value : Vec < u8 > ) -> Result < ( ) , Error > {
64- let url = format ! ( "{}/store/{}" , self . client. base_url, key) ;
48+ pub async fn set ( & self , key : & [ u8 ] , value : Vec < u8 > ) -> Result < ( ) , Error > {
49+ let key_b64 = general_purpose:: STANDARD . encode ( key) ;
50+ let url = format ! ( "{}/store/{}" , self . client. base_url, key_b64) ;
6551 let mut headers = reqwest:: header:: HeaderMap :: new ( ) ;
6652 headers. insert (
6753 AUTHORIZATION ,
@@ -87,8 +73,9 @@ impl Client {
8773 /// Retrieves a value from the store by its key.
8874 ///
8975 /// If the key does not exist, `Ok(None)` is returned.
90- pub async fn get ( & self , key : & str ) -> Result < Option < GetResult > , Error > {
91- let url = format ! ( "{}/store/{}" , self . client. base_url, key) ;
76+ pub async fn get ( & self , key : & [ u8 ] ) -> Result < Option < GetResultPayload > , Error > {
77+ let key_b64 = general_purpose:: STANDARD . encode ( key) ;
78+ let url = format ! ( "{}/store/{}" , self . client. base_url, key_b64) ;
9279 let mut headers = reqwest:: header:: HeaderMap :: new ( ) ;
9380 headers. insert (
9481 AUTHORIZATION ,
@@ -111,10 +98,7 @@ impl Client {
11198 return Err ( Error :: Http ( res. status ( ) ) ) ;
11299 }
113100
114- let payload: GetResultPayload = res. json ( ) . await ?;
115- let value = general_purpose:: STANDARD . decode ( payload. value ) ?;
116-
117- Ok ( Some ( GetResult { value } ) )
101+ Ok ( Some ( res. json ( ) . await ?) )
118102 }
119103
120104 /// Queries for a range of key-value pairs.
@@ -126,19 +110,21 @@ impl Client {
126110 /// * `limit` - The maximum number of results to return. If `None`, all results are returned.
127111 pub async fn query (
128112 & self ,
129- start : Option < & str > ,
130- end : Option < & str > ,
113+ start : Option < & [ u8 ] > ,
114+ end : Option < & [ u8 ] > ,
131115 limit : Option < usize > ,
132- ) -> Result < QueryResult , Error > {
116+ ) -> Result < QueryResultPayload , Error > {
133117 let mut url = format ! ( "{}/store?" , self . client. base_url) ;
134118 if let Some ( start) = start {
135- url. push_str ( & format ! ( "start={}&" , start) ) ;
119+ let start_b64 = general_purpose:: STANDARD . encode ( start) ;
120+ url. push_str ( & format ! ( "start={start_b64}&" ) ) ;
136121 }
137122 if let Some ( end) = end {
138- url. push_str ( & format ! ( "end={}&" , end) ) ;
123+ let end_b64 = general_purpose:: STANDARD . encode ( end) ;
124+ url. push_str ( & format ! ( "end={end_b64}&" ) ) ;
139125 }
140126 if let Some ( limit) = limit {
141- url. push_str ( & format ! ( "limit={}" , limit ) ) ;
127+ url. push_str ( & format ! ( "limit={limit}" ) ) ;
142128 }
143129
144130 let mut headers = reqwest:: header:: HeaderMap :: new ( ) ;
@@ -160,14 +146,7 @@ impl Client {
160146 }
161147
162148 let payload: QueryResultPayload = res. json ( ) . await ?;
163- let mut results = Vec :: new ( ) ;
164- for item in payload. results {
165- results. push ( QueryResultItem {
166- key : item. key ,
167- value : general_purpose:: STANDARD . decode ( item. value ) ?,
168- } ) ;
169- }
170149
171- Ok ( QueryResult { results } )
150+ Ok ( payload )
172151 }
173152}
0 commit comments