Sugar for wrapping structs in enums


#1

It would be nice to have sugar for wrapping structs in enums. Perhaps rust could derive the following two traits.

// Returns a reference to the wrapped struct "as A"
trait InnerAs<A: Send+Sync> {
    fn inner_as(&self) -> Option<&A>;
}

// Wrap a struct to create an enum
trait FromInner<A> {
    fn from_inner(inner: A) -> Self;
}

Here is a contrived example

trait Error {}

// Wrapped errors from submodule 1 and 2
pub struct Error1; 
pub struct Error2; 
impl Error for Error1 {}
impl Error for Error2 {}

// Error from present module
pub struct MyError {
    pub description: Box<String>,    
    pub kind: MyErrorKind
}

// #[deriving(FromInner)]
// #[deriving(InnerAs(Error))]
pub enum MyErrorKind {
    CausedBy1(Error1),
    CausedBy2(Error2),
    SomethingElse,
    Excuses
}

I would like rust to derive the following boiler plate code.

impl InnerAs<Error> for MyErrorKind {

    fn inner_as<'a>(&'a self) -> Option<&'a Error> {
        match *self {
            CausedBy1(ref error1) => Some(error1 as &'a Error),
            CausedBy2(ref error2) => Some(error2 as &'a Error),
            SomethingElse => None,
            Excuses => None,
        }
    }
}

Rust should complain if ErrorKind has a variant that contains more than 1 element

My code contains a lifetime error which is somehow caused by generics, but I hope that the general idea is clear

I would also like rust to derive the following boiler plate-code.

impl FromInner<Error1> for MyErrorKind {
    fn from_inner(error1: Error1) -> MyErrorKind {
        CausedBy1(error1)
    }
}

impl FromInner<Error2> for MyErrorKind {
    fn from_inner(error2: Error2) -> MyErrorKind {
        CausedBy2(error2)
    }
}

Rust should complain if any variant contains more than 1 element, or if it contains two variants with the same inner type

I believe that the code requires multicast

The syntax can probably be improved in many ways, but I like the general idea because it allows me to use match when I work with containers of structs that share a trait. Anyway I just wanted to throw the ideas in the air, hoping that someone would feel inspired to develop them in to an RFC.

EDIT: Typos layout language