Skip to content

Commit 5d8d92c

Browse files
committed
Use trappable_error to simplify signatures
Signed-off-by: itowlson <[email protected]>
1 parent 110e234 commit 5d8d92c

File tree

2 files changed

+44
-32
lines changed

2 files changed

+44
-32
lines changed

crates/key-value/src/lib.rs

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ impl KeyValueDispatch {
6060
pub fn get_store<T: 'static>(&self, store: Resource<T>) -> anyhow::Result<&Arc<dyn Store>> {
6161
self.stores.get(store.rep()).context("invalid store")
6262
}
63+
64+
pub fn get_store_wasi<T: 'static>(
65+
&self,
66+
store: Resource<T>,
67+
) -> Result<&Arc<dyn Store>, wasi_keyvalue::store::Error> {
68+
self.stores
69+
.get(store.rep())
70+
.ok_or(wasi_keyvalue::store::Error::NoSuchStore)
71+
}
6372
}
6473

6574
impl Default for KeyValueDispatch {
@@ -153,22 +162,23 @@ impl wasi_keyvalue::store::Host for KeyValueDispatch {
153162
async fn open(
154163
&mut self,
155164
identifier: String,
156-
) -> anyhow::Result<Result<Resource<wasi_keyvalue::store::Bucket>, wasi_keyvalue::store::Error>>
157-
{
158-
Ok(async {
159-
if self.allowed_stores.contains(&identifier) {
160-
let store = self
161-
.stores
162-
.push(self.manager.get(&identifier).await.map_err(to_wasi_err)?)
163-
.map_err(|()| {
164-
wasi_keyvalue::store::Error::Other("store table full".to_string())
165-
})?;
166-
Ok(Resource::new_own(store))
167-
} else {
168-
Err(wasi_keyvalue::store::Error::AccessDenied)
169-
}
165+
) -> Result<Resource<wasi_keyvalue::store::Bucket>, wasi_keyvalue::store::Error> {
166+
if self.allowed_stores.contains(&identifier) {
167+
let store = self
168+
.stores
169+
.push(self.manager.get(&identifier).await.map_err(to_wasi_err)?)
170+
.map_err(|()| wasi_keyvalue::store::Error::Other("store table full".to_string()))?;
171+
Ok(Resource::new_own(store))
172+
} else {
173+
Err(wasi_keyvalue::store::Error::AccessDenied)
170174
}
171-
.await)
175+
}
176+
177+
fn convert_error(
178+
&mut self,
179+
error: spin_world::wasi::keyvalue::store::Error,
180+
) -> std::result::Result<spin_world::wasi::keyvalue::store::Error, anyhow::Error> {
181+
Ok(error)
172182
}
173183
}
174184

@@ -179,52 +189,53 @@ impl wasi_keyvalue::store::HostBucket for KeyValueDispatch {
179189
&mut self,
180190
self_: Resource<Bucket>,
181191
key: String,
182-
) -> anyhow::Result<Result<Option<Vec<u8>>, wasi_keyvalue::store::Error>> {
183-
let store = self.get_store(self_)?;
184-
Ok(store.get(&key).await.map_err(to_wasi_err))
192+
) -> Result<Option<Vec<u8>>, wasi_keyvalue::store::Error> {
193+
let store = self.get_store_wasi(self_)?;
194+
store.get(&key).await.map_err(to_wasi_err)
185195
}
186196

187197
async fn set(
188198
&mut self,
189199
self_: Resource<Bucket>,
190200
key: String,
191201
value: Vec<u8>,
192-
) -> anyhow::Result<Result<(), wasi_keyvalue::store::Error>> {
193-
let store = self.get_store(self_)?;
194-
Ok(store.set(&key, &value).await.map_err(to_wasi_err))
202+
) -> Result<(), wasi_keyvalue::store::Error> {
203+
let store = self.get_store_wasi(self_)?;
204+
store.set(&key, &value).await.map_err(to_wasi_err)
195205
}
196206

197207
async fn delete(
198208
&mut self,
199209
self_: Resource<Bucket>,
200210
key: String,
201-
) -> anyhow::Result<Result<(), wasi_keyvalue::store::Error>> {
202-
let store = self.get_store(self_)?;
203-
Ok(store.delete(&key).await.map_err(to_wasi_err))
211+
) -> Result<(), wasi_keyvalue::store::Error> {
212+
let store = self.get_store_wasi(self_)?;
213+
store.delete(&key).await.map_err(to_wasi_err)
204214
}
205215

206216
async fn exists(
207217
&mut self,
208218
self_: Resource<Bucket>,
209219
key: String,
210-
) -> anyhow::Result<Result<bool, wasi_keyvalue::store::Error>> {
211-
let store = self.get_store(self_)?;
212-
Ok(store.exists(&key).await.map_err(to_wasi_err))
220+
) -> Result<bool, wasi_keyvalue::store::Error> {
221+
let store = self.get_store_wasi(self_)?;
222+
store.exists(&key).await.map_err(to_wasi_err)
213223
}
214224

215225
async fn list_keys(
216226
&mut self,
217227
self_: Resource<Bucket>,
218228
cursor: Option<u64>,
219-
) -> anyhow::Result<Result<wasi_keyvalue::store::KeyResponse, wasi_keyvalue::store::Error>>
220-
{
229+
) -> Result<wasi_keyvalue::store::KeyResponse, wasi_keyvalue::store::Error> {
221230
if cursor.unwrap_or_default() != 0 {
222-
anyhow::bail!("list_keys: cursor not supported");
231+
return Err(wasi_keyvalue::store::Error::Other(
232+
"list_keys: cursor not supported".to_owned(),
233+
));
223234
}
224235

225-
let store = self.get_store(self_)?;
236+
let store = self.get_store_wasi(self_)?;
226237
let keys = store.get_keys().await.map_err(to_wasi_err)?;
227-
Ok(Ok(wasi_keyvalue::store::KeyResponse { keys, cursor: None }))
238+
Ok(wasi_keyvalue::store::KeyResponse { keys, cursor: None })
228239
}
229240

230241
fn drop(&mut self, rep: Resource<Bucket>) -> anyhow::Result<()> {

crates/world/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ wasmtime::component::bindgen!({
2525
"fermyon:spin/[email protected]/error" => v2::sqlite::Error,
2626
"fermyon:spin/sqlite/error" => v1::sqlite::Error,
2727
"fermyon:spin/[email protected]/error" => v2::variables::Error,
28+
"wasi:keyvalue/store/error" => wasi::keyvalue::store::Error,
2829
},
2930
trappable_imports: true,
3031
});

0 commit comments

Comments
 (0)