snafu::guide

Module structs

source
Expand description

§Struct errors

You may not always need the flexibility of an enum for your error type. In those cases, you can use the familiar SNAFU attributes with a struct:

#[derive(Debug, Snafu)]
#[snafu(display("Unable to parse {} as MyEnum", value))]
struct ParseError {
    value: u8,
}

// That's all it takes! The rest is demonstration of how to use it.

#[derive(Debug)]
enum MyEnum {
    Alpha,
    Beta,
    Gamma,
}

impl TryFrom<u8> for MyEnum {
    type Error = ParseError;

    fn try_from(other: u8) -> Result<Self, Self::Error> {
        match other {
            0 => Ok(Self::Alpha),
            1 => Ok(Self::Beta),
            2 => Ok(Self::Gamma),
            value => ParseContext { value }.fail()
        }
    }
}

§Differences from enum errors

While each enum error variant creates a context selector that matches the variant’s name, context selectors for structs remove the suffix Error from the name of the error, if present, and add Context:

#[derive(Debug, Snafu)]
struct StructError;

fn struct_demonstration() -> Result<(), StructError> {
    StructContext.fail() // This differs from the struct name
}

#[derive(Debug, Snafu)]
enum EnumError {
    EnumExample,
}

fn enum_demonstration() -> Result<(), EnumError> {
    EnumExample.fail() // This matches the name of the enum variant
}