1- use anyhow:: Result ;
1+ use anyhow:: { Context , Result } ;
22use spin_app:: MetadataKey ;
33use spin_core:: { async_trait, wasmtime:: component:: Resource } ;
44use spin_world:: v2:: key_value;
@@ -25,7 +25,7 @@ pub trait StoreManager: Sync + Send {
2525
2626#[ async_trait]
2727pub trait Store : Sync + Send {
28- async fn get ( & self , key : & str ) -> Result < Vec < u8 > , Error > ;
28+ async fn get ( & self , key : & str ) -> Result < Option < Vec < u8 > > , Error > ;
2929 async fn set ( & self , key : & str , value : & [ u8 ] ) -> Result < ( ) , Error > ;
3030 async fn delete ( & self , key : & str ) -> Result < ( ) , Error > ;
3131 async fn exists ( & self , key : & str ) -> Result < bool , Error > ;
@@ -55,6 +55,10 @@ impl KeyValueDispatch {
5555 self . allowed_stores = allowed_stores;
5656 self . manager = manager;
5757 }
58+
59+ pub fn get_store ( & self , store : Resource < key_value:: Store > ) -> anyhow:: Result < & Arc < dyn Store > > {
60+ self . stores . get ( store. rep ( ) ) . context ( "invalid store" )
61+ }
5862}
5963
6064impl Default for KeyValueDispatch {
@@ -87,15 +91,9 @@ impl key_value::HostStore for KeyValueDispatch {
8791 & mut self ,
8892 store : Resource < key_value:: Store > ,
8993 key : String ,
90- ) -> Result < Result < Vec < u8 > , Error > > {
91- Ok ( async {
92- self . stores
93- . get ( store. rep ( ) )
94- . ok_or ( Error :: InvalidStore ) ?
95- . get ( & key)
96- . await
97- }
98- . await )
94+ ) -> Result < Result < Option < Vec < u8 > > , Error > > {
95+ let store = self . get_store ( store) ?;
96+ Ok ( store. get ( & key) . await )
9997 }
10098
10199 async fn set (
@@ -104,58 +102,34 @@ impl key_value::HostStore for KeyValueDispatch {
104102 key : String ,
105103 value : Vec < u8 > ,
106104 ) -> Result < Result < ( ) , Error > > {
107- Ok ( async {
108- self . stores
109- . get ( store. rep ( ) )
110- . ok_or ( Error :: InvalidStore ) ?
111- . set ( & key, & value)
112- . await
113- }
114- . await )
105+ let store = self . get_store ( store) ?;
106+ Ok ( store. set ( & key, & value) . await )
115107 }
116108
117109 async fn delete (
118110 & mut self ,
119111 store : Resource < key_value:: Store > ,
120112 key : String ,
121113 ) -> Result < Result < ( ) , Error > > {
122- Ok ( async {
123- self . stores
124- . get ( store. rep ( ) )
125- . ok_or ( Error :: InvalidStore ) ?
126- . delete ( & key)
127- . await
128- }
129- . await )
114+ let store = self . get_store ( store) ?;
115+ Ok ( store. delete ( & key) . await )
130116 }
131117
132118 async fn exists (
133119 & mut self ,
134120 store : Resource < key_value:: Store > ,
135121 key : String ,
136122 ) -> Result < Result < bool , Error > > {
137- Ok ( async {
138- self . stores
139- . get ( store. rep ( ) )
140- . ok_or ( Error :: InvalidStore ) ?
141- . exists ( & key)
142- . await
143- }
144- . await )
123+ let store = self . get_store ( store) ?;
124+ Ok ( store. exists ( & key) . await )
145125 }
146126
147127 async fn get_keys (
148128 & mut self ,
149129 store : Resource < key_value:: Store > ,
150130 ) -> Result < Result < Vec < String > , Error > > {
151- Ok ( async {
152- self . stores
153- . get ( store. rep ( ) )
154- . ok_or ( Error :: InvalidStore ) ?
155- . get_keys ( )
156- . await
157- }
158- . await )
131+ let store = self . get_store ( store) ?;
132+ Ok ( store. get_keys ( ) . await )
159133 }
160134
161135 fn drop ( & mut self , store : Resource < key_value:: Store > ) -> Result < ( ) > {
@@ -166,7 +140,7 @@ impl key_value::HostStore for KeyValueDispatch {
166140
167141pub fn log_error ( err : impl std:: fmt:: Debug ) -> Error {
168142 tracing:: warn!( "key-value error: {err:?}" ) ;
169- Error :: Io ( format ! ( "{err:?}" ) )
143+ Error :: Other ( format ! ( "{err:?}" ) )
170144}
171145
172146use spin_world:: v1:: key_value:: Error as LegacyError ;
@@ -176,9 +150,7 @@ fn to_legacy_error(value: key_value::Error) -> LegacyError {
176150 Error :: StoreTableFull => LegacyError :: StoreTableFull ,
177151 Error :: NoSuchStore => LegacyError :: NoSuchStore ,
178152 Error :: AccessDenied => LegacyError :: AccessDenied ,
179- Error :: InvalidStore => LegacyError :: InvalidStore ,
180- Error :: NoSuchKey => LegacyError :: NoSuchKey ,
181- Error :: Io ( s) => LegacyError :: Io ( s) ,
153+ Error :: Other ( s) => LegacyError :: Io ( s) ,
182154 }
183155}
184156
@@ -192,7 +164,9 @@ impl spin_world::v1::key_value::Host for KeyValueDispatch {
192164 async fn get ( & mut self , store : u32 , key : String ) -> Result < Result < Vec < u8 > , LegacyError > > {
193165 let this = Resource :: new_borrow ( store) ;
194166 let result = <Self as key_value:: HostStore >:: get ( self , this, key) . await ?;
195- Ok ( result. map_err ( to_legacy_error) )
167+ Ok ( result
168+ . map_err ( to_legacy_error)
169+ . and_then ( |v| v. ok_or ( LegacyError :: NoSuchKey ) ) )
196170 }
197171
198172 async fn set (
0 commit comments