Struct Error
pub struct Error<Kind> { /* private fields */ }Expand description
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());Implementations§
Source§impl<Kind> Error<Kind>
impl<Kind> Error<Kind>
Sourcepub fn new<E>(kind: Kind, error: E) -> Error<Kind>
pub fn new<E>(kind: Kind, error: E) -> Error<Kind>
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());Sourcepub fn chained<E, S>(kind: Kind, error: E, source: S) -> Error<Kind>
pub fn chained<E, S>(kind: Kind, error: E, source: S) -> Error<Kind>
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!");Sourcepub fn get_ref(&self) -> Option<&(dyn Error + Send + Sync + 'static)>
pub fn get_ref(&self) -> Option<&(dyn Error + Send + Sync + 'static)>
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!"));
}Sourcepub fn get_mut(&mut self) -> Option<&mut (dyn Error + Send + Sync + 'static)>
pub fn get_mut(&mut self) -> Option<&mut (dyn Error + Send + Sync + 'static)>
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())));
}Sourcepub fn into_inner(self) -> Option<Box<dyn Error + Send + Sync>>
pub fn into_inner(self) -> Option<Box<dyn Error + 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!");Trait Implementations§
Source§impl<Kind> Error for Error<Kind>
impl<Kind> Error for Error<Kind>
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
Auto Trait Implementations§
impl<Kind> Freeze for Error<Kind>where
Kind: Freeze,
impl<Kind> !RefUnwindSafe for Error<Kind>
impl<Kind> Send for Error<Kind>where
Kind: Send,
impl<Kind> Sync for Error<Kind>where
Kind: Sync,
impl<Kind> Unpin for Error<Kind>where
Kind: Unpin,
impl<Kind> !UnwindSafe for Error<Kind>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more