GuestErrorType only needs to have a success constructor
This commit is contained in:
@@ -60,7 +60,7 @@ pub fn define_func(names: &Names, func: &witx::InterfaceFunc) -> TokenStream {
|
|||||||
let err_typename = names.type_ref(&tref, anon_lifetime());
|
let err_typename = names.type_ref(&tref, anon_lifetime());
|
||||||
quote! {
|
quote! {
|
||||||
let e = wiggle::GuestError::InFunc { funcname: #funcname, location: #location, err: Box::new(e.into()) };
|
let e = wiggle::GuestError::InFunc { funcname: #funcname, location: #location, err: Box::new(e.into()) };
|
||||||
let err: #err_typename = wiggle::GuestErrorType::from_error(e, ctx);
|
let err: #err_typename = wiggle::GuestErrorType::from_error(e, ctx); // XXX replace with conversion method on trait!
|
||||||
return #abi_ret::from(err);
|
return #abi_ret::from(err);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -66,16 +66,11 @@ use syn::parse_macro_input;
|
|||||||
///
|
///
|
||||||
/// /// For all types used in the `Error` position of a `Result` in the module
|
/// /// For all types used in the `Error` position of a `Result` in the module
|
||||||
/// /// traits, you must implement `GuestErrorType` which tells wiggle-generated
|
/// /// traits, you must implement `GuestErrorType` which tells wiggle-generated
|
||||||
/// /// code how to determine if a method call has been successful, as well as
|
/// /// code what value to return when the method returns Ok(...).
|
||||||
/// /// how to translate a wiggle runtime error into an ABI-level error.
|
/// impl GuestErrorType for types::Errno {
|
||||||
/// impl<'a> GuestErrorType<'a> for types::Errno {
|
|
||||||
/// type Context = YourCtxType;
|
|
||||||
/// fn success() -> Self {
|
/// fn success() -> Self {
|
||||||
/// unimplemented!()
|
/// unimplemented!()
|
||||||
/// }
|
/// }
|
||||||
/// fn from_error(_e: wiggle::GuestError, _c: &Self::Context) -> Self {
|
|
||||||
/// unimplemented!()
|
|
||||||
/// }
|
|
||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// # fn main() { println!("this fools doc tests into compiling the above outside a function body")
|
/// # fn main() { println!("this fools doc tests into compiling the above outside a function body")
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
use crate::{GuestError, GuestPtr};
|
use crate::{GuestError, GuestPtr};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
pub trait GuestErrorType<'a> {
|
/// A trait for types which are used to report errors. Each type used in the
|
||||||
type Context;
|
/// first result position of an interface function is used, by convention, to
|
||||||
|
/// indicate whether the function was successful and subsequent results are valid,
|
||||||
|
/// or whether an error occured. This trait allows wiggle to return the correct
|
||||||
|
/// value when the interface function's idiomatic Rust method returns
|
||||||
|
/// Ok(<rest of return values>).
|
||||||
|
pub trait GuestErrorType {
|
||||||
fn success() -> Self;
|
fn success() -> Self;
|
||||||
fn from_error(e: GuestError, ctx: &Self::Context) -> Self;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A trait for types that are intended to be pointees in `GuestPtr<T>`.
|
/// A trait for types that are intended to be pointees in `GuestPtr<T>`.
|
||||||
|
|||||||
@@ -314,16 +314,10 @@ impl<'a> WasiCtx<'a> {
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! impl_errno {
|
macro_rules! impl_errno {
|
||||||
( $errno:ty ) => {
|
( $errno:ty ) => {
|
||||||
impl<'a> wiggle::GuestErrorType<'a> for $errno {
|
impl wiggle::GuestErrorType for $errno {
|
||||||
type Context = WasiCtx<'a>;
|
|
||||||
fn success() -> $errno {
|
fn success() -> $errno {
|
||||||
<$errno>::Ok
|
<$errno>::Ok
|
||||||
}
|
}
|
||||||
fn from_error(e: GuestError, ctx: &WasiCtx) -> $errno {
|
|
||||||
eprintln!("GUEST ERROR: {:?}", e);
|
|
||||||
ctx.guest_errors.borrow_mut().push(e);
|
|
||||||
types::Errno::InvalidArg
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,18 +23,10 @@ fn document_equivelant() {
|
|||||||
|
|
||||||
type Result<T> = std::result::Result<T, types::Errno>;
|
type Result<T> = std::result::Result<T, types::Errno>;
|
||||||
|
|
||||||
impl<'a> GuestErrorType<'a> for types::Errno {
|
impl GuestErrorType for types::Errno {
|
||||||
type Context = WasiCtx<'a>;
|
|
||||||
|
|
||||||
fn success() -> types::Errno {
|
fn success() -> types::Errno {
|
||||||
types::Errno::Success
|
types::Errno::Success
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_error(e: GuestError, ctx: &Self::Context) -> types::Errno {
|
|
||||||
eprintln!("GUEST ERROR: {:?}", e);
|
|
||||||
ctx.guest_errors.borrow_mut().push(e);
|
|
||||||
types::Errno::Io
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> crate::wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx<'a> {
|
impl<'a> crate::wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx<'a> {
|
||||||
|
|||||||
Reference in New Issue
Block a user