[−]Struct astral::error::Error
The generic error type for the Astral engine.
Error
can be created with crafted error messages and a particular value of
Kind
and optionally with a arbitrary error payload.
It is useful but not necessary, that Kind
implements Debug
and
Display
so std::error::Error
is implemented.
Example
use std::fmt::{self, Debug, Display, Formatter}; use std::error::Error as StdError; use astral::error::Error; #[derive(Debug, PartialEq)] enum MyErrorKind { Variant, } impl Display for MyErrorKind { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { Debug::fmt(self, f) } } let my_error = Error::new(MyErrorKind::Variant, "oh no!"); let my_error2 = Error::new(MyErrorKind::Variant, my_error); assert_eq!(*my_error2.kind(), MyErrorKind::Variant); assert!(my_error2.source().is_none());
Methods
impl<Kind> Error<Kind>
pub fn new<E>(kind: Kind, error: E) -> Error<Kind> where
E: Into<Box<dyn Error + 'static + Send + Sync>>,
E: Into<Box<dyn Error + 'static + Send + Sync>>,
Creates a new error from a known kind of error as well as an arbitrary
error payload. The error
argument is an arbitrary payload which will
be contained in this Error
. The resulting error don't have a source
error returned by Error::source
.
Example
use std::error::Error as StdError; use astral::error::Error; let my_error = Error::new(MyErrorKind::Variant, "oh no!"); let my_error2 = Error::new(MyErrorKind::Variant, my_error); assert!(my_error2.source().is_none());
pub fn chained<E, S>(kind: Kind, error: E, source: S) -> Error<Kind> where
E: Into<Box<dyn Error + 'static + Send + Sync>>,
S: Into<Box<dyn Error + 'static + Send + Sync>>,
E: Into<Box<dyn Error + 'static + Send + Sync>>,
S: Into<Box<dyn Error + 'static + Send + Sync>>,
Creates a new error from a known kind of error as well as an arbitrary error payload and keeps another payload as source error.
The error
argument is an arbitrary payload which will be contained in
this Error
. The source
argument is an error, which will be returned
by Error::source
Example
use std::error::Error as StdError; use astral::error::Error; let my_error = Error::new(MyErrorKind::Variant, "oh no!"); let my_error2 = Error::chained(MyErrorKind::Variant, "failed!", my_error); assert_eq!(my_error2.source()?.to_string(), "oh no!");
pub fn get_ref(&self) -> Option<&(dyn Error + 'static + Send + Sync)>
Returns a reference to the inner error wrapped by this error (if any).
If this Error
was constructed via new
or chained
then this
function will return Some
, otherwise it will return None
.
Examples
use astral::error::Error; #[derive(Debug)] enum MyErrorKind { Variant, } fn print_error<Kind>(err: &Error<Kind>) { if let Some(inner_err) = err.get_ref() { println!("Inner error: {:?}", inner_err); } else { println!("No inner error"); } } fn main() { // Will print "Inner error: Variant". print_error(&Error::new(MyErrorKind::Variant, "oh no!")); }
pub fn get_mut(&mut self) -> Option<&mut (dyn Error + 'static + Send + Sync)>
Returns a mutable reference to the inner error wrapped by this error (if any).
If this Error
was constructed via new
or chained
then this
function will return Some
, otherwise it will return None
.
Examples
use std::{error, fmt}; use std::fmt::Display; use astral::error::Error; #[derive(Debug)] struct MyError { v: String, } impl MyError { fn new() -> MyError { MyError { v: "oh no!".to_string() } } fn change_message(&mut self, new_message: &str) { self.v = new_message.to_string(); } } impl error::Error for MyError {} impl Display for MyError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "MyError: {}", &self.v) } } fn change_error<Kind>(mut err: Error<Kind>) -> Error<Kind> { if let Some(inner_err) = err.get_mut() { inner_err.downcast_mut::<MyError>().unwrap().change_message("I've been changed!"); } err } #[derive(Debug)] enum MyErrorKind { Variant, } fn print_error<Kind>(err: &Error<Kind>) { if let Some(inner_err) = err.get_ref() { println!("Inner error: {}", inner_err); } else { println!("No inner error"); } } fn main() { // Will print "Inner error: ...". print_error(&change_error(Error::new(MyErrorKind::Variant, MyError::new()))); }
pub fn into_inner(self) -> Option<Box<dyn Error + 'static + Send + Sync>>
Consumes the Error
, returning its inner error (if any).
If this Error
was constructed via new
or chained
then this
function will return Some
, otherwise it will return None
.
Example
use astral::error::Error; let my_error = Error::new(MyErrorKind::Variant, "oh no!"); let my_error2 = Error::new(MyErrorKind::Variant, my_error); assert_eq!(my_error2.into_inner()?.to_string(), "oh no!");
pub fn kind(&self) -> &Kind
Returns the corresponding Kind
for this error.
Example
use astral::error::Error; #[derive(Debug, PartialEq)] enum MyErrorKind { Variant, } let my_error = Error::new(MyErrorKind::Variant, "oh no!"); assert_eq!(*my_error.kind(), MyErrorKind::Variant);
Trait Implementations
impl<Kind> Display for Error<Kind> where
Kind: Display,
Kind: Display,
impl<Kind> Error for Error<Kind> where
Kind: Debug + Display,
Kind: Debug + Display,
fn source(&self) -> Option<&(dyn Error + 'static)>
fn description(&self) -> &str
1.0.0[src]
This method is soft-deprecated. Read more
fn cause(&self) -> Option<&dyn Error>
1.0.0[src]
replaced by Error::source, which can support downcasting
The lower-level cause of this error, if any. Read more
impl<Kind> Debug for Error<Kind> where
Kind: Debug,
Kind: Debug,
impl<Kind> From<Kind> for Error<Kind>
Auto Trait Implementations
Blanket Implementations
impl<T> ToString for T where
T: Display + ?Sized,
[src]
T: Display + ?Sized,
impl<T> From for T
[src]
impl<T, U> Into for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryFrom for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = !
try_from
)The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T> Borrow for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> BorrowMut for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T, U> TryInto for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,