[]Struct astral::error::Error

pub struct Error<Kind> { /* fields omitted */ }

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>>, 

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>>, 

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

impl<Kind> Error for Error<Kind> where
    Kind: Debug + Display

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]

Deprecated since 1.33.0:

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

impl<Kind> From<Kind> for Error<Kind>

Auto Trait Implementations

impl<Kind> Send for Error<Kind> where
    Kind: Send

impl<Kind> Sync for Error<Kind> where
    Kind: Sync

Blanket Implementations

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    U: Into<T>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.