Isn't this a job for a macro, à la snafu::ensure?
let_ensure!(SomeVariant(thing) = an_enum, "an_enum should be of type SomeVariant");
// Expands to
let thing = if let SomeVariant(thing) = an_enum {
thing
} else {
return Error("an_enum should be of type SomeVariant")
}
// do something with thing