Module snafu::guide::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
}