Skip to main content

wasmtime_internal_core/error/
to_wasmtime_result.rs

1use crate::error::Result;
2
3/// Extension trait for easily converting `anyhow::Result`s into
4/// `wasmtime::Result`s.
5///
6/// This is a small convenience helper to replace
7/// `anyhow_result.map_err(wasmtime::Error::from_anyhow)` with
8/// `anyhow_result.to_wasmtime_result()`.
9///
10/// Requires that the `"anyhow"` cargo feature is enabled.
11///
12/// # Example
13///
14/// ```
15/// # fn _foo() {
16/// #![cfg(feature = "anyhow")]
17/// # use wasmtime_internal_core::error as wasmtime;
18/// use wasmtime::ToWasmtimeResult as _;
19///
20/// fn returns_anyhow_result() -> anyhow::Result<u32> {
21///     anyhow::bail!("eep")
22/// }
23///
24/// fn returns_wasmtime_result() -> wasmtime::Result<()> {
25///     // The following is equivalent to
26///     //
27///     //     returns_anyhow_result()
28///     //         .map_err(wasmtime::Error::from_anyhow)?;
29///     returns_anyhow_result().to_wasmtime_result()?;
30///     Ok(())
31/// }
32///
33/// let error: wasmtime::Error = returns_wasmtime_result().unwrap_err();
34/// assert!(error.is::<anyhow::Error>());
35/// assert_eq!(error.to_string(), "eep");
36/// # }
37/// ```
38pub trait ToWasmtimeResult<T> {
39    /// Convert this `anyhow::Result<T>` into a `wasmtime::Result<T>`.
40    fn to_wasmtime_result(self) -> Result<T>;
41}
42
43#[cfg(feature = "anyhow")]
44impl<T> ToWasmtimeResult<T> for anyhow::Result<T> {
45    #[inline]
46    fn to_wasmtime_result(self) -> Result<T> {
47        match self {
48            Ok(x) => Ok(x),
49            Err(e) => Err(crate::error::Error::from_anyhow(e)),
50        }
51    }
52}
53
54impl<T> ToWasmtimeResult<T> for Result<T> {
55    #[inline]
56    fn to_wasmtime_result(self) -> Result<T> {
57        self
58    }
59}