wrpc_runtime_wasmtime/rpc/host/
error.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use anyhow::Context as _;
use wasmtime::component::Resource;
use wasmtime_wasi::bindings::io::error::Error as IoError;

use crate::bindings::rpc::error::{Error, Host, HostError};
use crate::rpc::WrpcRpcImpl;
use crate::{WrpcView, WrpcViewExt as _};

impl<T: WrpcView> Host for WrpcRpcImpl<T> {}

impl<T: WrpcView> HostError for WrpcRpcImpl<T> {
    fn from_io_error(
        &mut self,
        error: Resource<IoError>,
    ) -> wasmtime::Result<Result<Resource<Error>, Resource<IoError>>> {
        let table = self.0.table();
        let error = table
            .delete::<IoError>(error)
            .context("failed to delete `wasi:io/error.error` from table")?;
        match error.downcast() {
            Ok(error) => {
                let error = self.0.push_error(Error::Stream(error))?;
                Ok(Ok(error))
            }
            Err(error) => {
                let error = table
                    .push(error)
                    .context("failed to push `wasi:io/error.error` to table")?;
                Ok(Err(error))
            }
        }
    }

    fn to_debug_string(&mut self, error: Resource<Error>) -> wasmtime::Result<String> {
        let error = self.0.get_error(&error)?;
        Ok(format!("{error:#}"))
    }

    fn drop(&mut self, error: Resource<Error>) -> wasmtime::Result<()> {
        self.0.delete_error(error)?;
        Ok(())
    }
}