Skip to content

Add support for impl From<T> for ErrorEnum where T: Into<OneVariantsSource> #518

@shepmaster

Description

@shepmaster

Prior comments:

#[derive(Snafu)]
enum Error {
    #[snafu(transparent)]
    #[snafu(source(forward))]
    DomainA { source: a::Error },
    #[snafu(transparent)]
    DomainB { source: b::Error },
}

Generated:

impl<T> From<T> for Error
where T: Into<a::Error>
{
   fn from(val: T) -> Self {
       Self::DomainA { source: val.into() }
   }
}

impl From<b::Error> for Error {
   fn from(val: b::Error) -> Self {
       Self::DomainB { source: val }
   }
}

Since Rust does not yet support specialization, I still need to call map_err for T: Into<b::error>. However, a forward From implementation for the most frequently used variant can significantly reduces boilerplate.

Originally posted by @Huliiiiii in #481

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions