11use crate :: { get_blob, Message , PackageId , Request } ;
2- use serde:: { Deserialize , Serialize } ;
2+ use serde:: { de:: DeserializeOwned , Deserialize , Serialize } ;
3+ use std:: marker:: PhantomData ;
34use thiserror:: Error ;
45
56/// Actions are sent to a specific key value database, "db" is the name,
@@ -54,22 +55,29 @@ pub enum KvError {
5455/// Opening or creating a kv will give you a Result<Kv>.
5556/// You can call it's impl functions to interact with it.
5657#[ derive( Debug , Serialize , Deserialize ) ]
57- pub struct Kv {
58+ pub struct Kv < K , V > {
5859 pub package_id : PackageId ,
5960 pub db : String ,
61+ pub timeout : u64 ,
62+ _marker : PhantomData < ( K , V ) > ,
6063}
6164
62- impl Kv {
65+ impl < K , V > Kv < K , V >
66+ where
67+ K : Serialize + DeserializeOwned ,
68+ V : Serialize + DeserializeOwned ,
69+ {
6370 /// Get a value.
64- pub fn get ( & self , key : Vec < u8 > ) -> anyhow:: Result < Vec < u8 > > {
71+ pub fn get ( & self , key : & K ) -> anyhow:: Result < V > {
72+ let key = serde_json:: to_vec ( key) ?;
6573 let res = Request :: new ( )
6674 . target ( ( "our" , "kv" , "distro" , "sys" ) )
6775 . body ( serde_json:: to_vec ( & KvRequest {
6876 package_id : self . package_id . clone ( ) ,
6977 db : self . db . clone ( ) ,
7078 action : KvAction :: Get { key } ,
7179 } ) ?)
72- . send_and_await_response ( 5 ) ?;
80+ . send_and_await_response ( self . timeout ) ?;
7381
7482 match res {
7583 Ok ( Message :: Response { body, .. } ) => {
@@ -81,7 +89,9 @@ impl Kv {
8189 Some ( bytes) => bytes. bytes ,
8290 None => return Err ( anyhow:: anyhow!( "kv: no blob" ) ) ,
8391 } ;
84- Ok ( bytes)
92+ let value = serde_json:: from_slice :: < V > ( & bytes)
93+ . map_err ( |e| anyhow:: anyhow!( "Failed to deserialize value: {}" , e) ) ?;
94+ Ok ( value)
8595 }
8696 KvResponse :: Err { error } => Err ( error. into ( ) ) ,
8797 _ => Err ( anyhow:: anyhow!( "kv: unexpected response {:?}" , response) ) ,
@@ -92,7 +102,10 @@ impl Kv {
92102 }
93103
94104 /// Set a value, optionally in a transaction.
95- pub fn set ( & self , key : Vec < u8 > , value : Vec < u8 > , tx_id : Option < u64 > ) -> anyhow:: Result < ( ) > {
105+ pub fn set ( & self , key : & K , value : & V , tx_id : Option < u64 > ) -> anyhow:: Result < ( ) > {
106+ let key = serde_json:: to_vec ( key) ?;
107+ let value = serde_json:: to_vec ( value) ?;
108+
96109 let res = Request :: new ( )
97110 . target ( ( "our" , "kv" , "distro" , "sys" ) )
98111 . body ( serde_json:: to_vec ( & KvRequest {
@@ -101,7 +114,7 @@ impl Kv {
101114 action : KvAction :: Set { key, tx_id } ,
102115 } ) ?)
103116 . blob_bytes ( value)
104- . send_and_await_response ( 5 ) ?;
117+ . send_and_await_response ( self . timeout ) ?;
105118
106119 match res {
107120 Ok ( Message :: Response { body, .. } ) => {
@@ -118,15 +131,16 @@ impl Kv {
118131 }
119132
120133 /// Delete a value, optionally in a transaction.
121- pub fn delete ( & self , key : Vec < u8 > , tx_id : Option < u64 > ) -> anyhow:: Result < ( ) > {
134+ pub fn delete ( & self , key : & K , tx_id : Option < u64 > ) -> anyhow:: Result < ( ) > {
135+ let key = serde_json:: to_vec ( key) ?;
122136 let res = Request :: new ( )
123137 . target ( ( "our" , "kv" , "distro" , "sys" ) )
124138 . body ( serde_json:: to_vec ( & KvRequest {
125139 package_id : self . package_id . clone ( ) ,
126140 db : self . db . clone ( ) ,
127141 action : KvAction :: Delete { key, tx_id } ,
128142 } ) ?)
129- . send_and_await_response ( 5 ) ?;
143+ . send_and_await_response ( self . timeout ) ?;
130144
131145 match res {
132146 Ok ( Message :: Response { body, .. } ) => {
@@ -151,7 +165,7 @@ impl Kv {
151165 db : self . db . clone ( ) ,
152166 action : KvAction :: BeginTx ,
153167 } ) ?)
154- . send_and_await_response ( 5 ) ?;
168+ . send_and_await_response ( self . timeout ) ?;
155169
156170 match res {
157171 Ok ( Message :: Response { body, .. } ) => {
@@ -176,7 +190,7 @@ impl Kv {
176190 db : self . db . clone ( ) ,
177191 action : KvAction :: Commit { tx_id } ,
178192 } ) ?)
179- . send_and_await_response ( 5 ) ?;
193+ . send_and_await_response ( self . timeout ) ?;
180194
181195 match res {
182196 Ok ( Message :: Response { body, .. } ) => {
@@ -194,15 +208,21 @@ impl Kv {
194208}
195209
196210/// Opens or creates a kv db.
197- pub fn open ( package_id : PackageId , db : & str ) -> anyhow:: Result < Kv > {
211+ pub fn open < K , V > ( package_id : PackageId , db : & str , timeout : Option < u64 > ) -> anyhow:: Result < Kv < K , V > >
212+ where
213+ K : Serialize + DeserializeOwned ,
214+ V : Serialize + DeserializeOwned ,
215+ {
216+ let timeout = timeout. unwrap_or ( 5 ) ;
217+
198218 let res = Request :: new ( )
199219 . target ( ( "our" , "kv" , "distro" , "sys" ) )
200220 . body ( serde_json:: to_vec ( & KvRequest {
201221 package_id : package_id. clone ( ) ,
202222 db : db. to_string ( ) ,
203223 action : KvAction :: Open ,
204224 } ) ?)
205- . send_and_await_response ( 5 ) ?;
225+ . send_and_await_response ( timeout ) ?;
206226
207227 match res {
208228 Ok ( Message :: Response { body, .. } ) => {
@@ -212,6 +232,8 @@ pub fn open(package_id: PackageId, db: &str) -> anyhow::Result<Kv> {
212232 KvResponse :: Ok => Ok ( Kv {
213233 package_id,
214234 db : db. to_string ( ) ,
235+ timeout,
236+ _marker : PhantomData ,
215237 } ) ,
216238 KvResponse :: Err { error } => Err ( error. into ( ) ) ,
217239 _ => Err ( anyhow:: anyhow!( "kv: unexpected response {:?}" , response) ) ,
@@ -222,15 +244,17 @@ pub fn open(package_id: PackageId, db: &str) -> anyhow::Result<Kv> {
222244}
223245
224246/// Removes and deletes a kv db.
225- pub fn remove_db ( package_id : PackageId , db : & str ) -> anyhow:: Result < ( ) > {
247+ pub fn remove_db ( package_id : PackageId , db : & str , timeout : Option < u64 > ) -> anyhow:: Result < ( ) > {
248+ let timeout = timeout. unwrap_or ( 5 ) ;
249+
226250 let res = Request :: new ( )
227251 . target ( ( "our" , "kv" , "distro" , "sys" ) )
228252 . body ( serde_json:: to_vec ( & KvRequest {
229253 package_id : package_id. clone ( ) ,
230254 db : db. to_string ( ) ,
231255 action : KvAction :: RemoveDb ,
232256 } ) ?)
233- . send_and_await_response ( 5 ) ?;
257+ . send_and_await_response ( timeout ) ?;
234258
235259 match res {
236260 Ok ( Message :: Response { body, .. } ) => {
0 commit comments