Struct Status

Source
pub struct Status<K: Kind = Unkind, C: Context = AdhocContext> { /* private fields */ }
Expand description

A container for use in Result<_, Status>..

Goals:

  • Easy crate inter-op while maintaining programmatic processing.
  • User-friendly without losing helpful debug information.

Note: this is optimized for the happy-path. When failing frequently inside of an inner loop, consider using your Kind to convey your status.

§Example

use status::Kind;

#[derive(Copy, Clone, Debug, derive_more::Display)]
enum ErrorKind {
  #[display(fmt = "Failed to read file")]
  Read,
  #[display(fmt = "Failed to parse")]
  Parse,
}
type Status = status::Status<ErrorKind>;
type Result<T, E = Status> = std::result::Result<T, E>;

fn read_file() -> Result<()> {
    return ErrorKind::Read.into_err();
}

Implementations§

Source§

impl<K: Kind, C: Context> Status<K, C>

Source

pub fn new<U>(kind: U) -> Self
where U: Into<K>,

Create a container for the specified status Kind.

§Example
fn read_file() -> Result<(), status::Status> {
    return Err(status::Status::new("Failed to read file"));
}
Source

pub fn with_source<E>(self, error: E) -> Self
where E: Error + 'static,

Add a public error.

Source

pub fn with_internal<E>(self, error: E) -> Self
where E: Error + 'static,

Add an internal error.

Source

pub fn context_with<F>(self, context: F) -> Self
where F: Fn(C) -> C,

Extend the Context.

Source

pub fn context(&self) -> &C

Access the Context for programmatic usage.

Source

pub fn kind(&self) -> K

Programmatic identifier for which error occurred.

§Example
#[derive(Copy, Clone, Debug, derive_more::Display)]
enum ErrorKind {
  #[display(fmt = "Failed to read file")]
  Read,
  #[display(fmt = "Failed to parse")]
  Parse,
}

fn read_file() -> Result<()> {
}

fn process_file() -> Result<()> {
    match read_file() {
        Ok(_) => Ok(()),
        Err(e) => match e.kind() {
          ErrorKind::Read => Err(e),
          ErrorKind::Parse => Ok(()),
        }
    }
}
Source

pub fn sources(&self) -> Chain<'_>

An iterator for the chain of sources.

When debugging, to display internal sources, run Status::into_internal.

§Example
use status::Status;
use std::io;

pub fn underlying_io_error_kind(error: &Status) -> Option<io::ErrorKind> {
    for cause in error.sources() {
        if let Some(io_error) = cause.downcast_ref::<io::Error>() {
            return Some(io_error.kind());
        }
    }
    None
}
Source

pub fn root_source(&self) -> Option<&(dyn Error + 'static)>

The lowest level cause of this error — this error’s cause’s cause’s cause etc.

The root cause is the last error in the iterator produced by sources().

§Example
use status::Status;
use std::io;

pub fn underlying_io_error_kind(error: &Status) -> Option<io::ErrorKind> {
    let cause = error.root_source()?;
    if let Some(io_error) = cause.downcast_ref::<io::Error>() {
        return Some(io_error.kind());
    }
    None
}
Source

pub fn into_internal(self) -> InternalStatus<K, C>

View of Status, exposing implementation details.

Error::source and InternalStatus::sources are for debug / display purposes only and relying on them programmatically is likely to break across minor releases.

§Example
fn display_status(status: status::Status) {
    if std::env::var("DEBUG").as_ref().map(|s| s.as_ref()).unwrap_or("0") == "1" {
        let status = status.into_internal();
        println!("{}", status);
    } else {
        println!("{}", status);
    }
}
Source

pub fn into_err<T>(self) -> Result<T, Self>

Convenience for returning an error.

Trait Implementations§

Source§

impl<K: Debug + Kind, C: Debug + Context> Debug for Status<K, C>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<K: Kind, C: Context> Deref for Status<K, C>

Source§

type Target = C

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<K: Kind, C: Context> DerefMut for Status<K, C>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<K: Kind, C: Context> Display for Status<K, C>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<K: Kind, C: Context> Error for Status<K, C>

Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

§

impl<K, C> Freeze for Status<K, C>

§

impl<K = Unkind, C = AdhocContext> !RefUnwindSafe for Status<K, C>

§

impl<K = Unkind, C = AdhocContext> !Send for Status<K, C>

§

impl<K = Unkind, C = AdhocContext> !Sync for Status<K, C>

§

impl<K, C> Unpin for Status<K, C>

§

impl<K = Unkind, C = AdhocContext> !UnwindSafe for Status<K, C>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.