wrpc_runtime_wasmtime/rpc/host/
error.rs1use anyhow::Context as _;
2use wasmtime::component::Resource;
3use wasmtime_wasi::p2::bindings::io::error::Error as IoError;
4
5use crate::bindings::rpc::error::{Error, Host, HostError};
6use crate::rpc::WrpcRpcImpl;
7use crate::{WrpcView, WrpcViewExt as _};
8
9impl<T: WrpcView> Host for WrpcRpcImpl<T> {}
10
11impl<T: WrpcView> HostError for WrpcRpcImpl<T> {
12 fn from_io_error(
13 &mut self,
14 error: Resource<IoError>,
15 ) -> wasmtime::Result<Result<Resource<Error>, Resource<IoError>>> {
16 let table = self.0.wrpc().table;
17 let error = table
18 .delete::<IoError>(error)
19 .context("failed to delete `wasi:io/error.error` from table")?;
20 match error.downcast() {
21 Ok(error) => {
22 let error = self.0.push_error(Error::Stream(error))?;
23 Ok(Ok(error))
24 }
25 Err(error) => {
26 let error = table
27 .push(error)
28 .context("failed to push `wasi:io/error.error` to table")?;
29 Ok(Err(error))
30 }
31 }
32 }
33
34 fn to_debug_string(&mut self, error: Resource<Error>) -> wasmtime::Result<String> {
35 let error = self.0.get_error(&error)?;
36 Ok(format!("{error:#}"))
37 }
38
39 fn drop(&mut self, error: Resource<Error>) -> wasmtime::Result<()> {
40 self.0.delete_error(error)?;
41 Ok(())
42 }
43}