wrpc_runtime_wasmtime/rpc/host/
error.rs

1use 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}