proxy-enum icon indicating copy to clipboard operation
proxy-enum copied to clipboard

Allow generic arguments in enum variants

Open AlephAlpha opened this issue 4 years ago • 1 comments

Allow generic arguments in enum variants, for example:

#[proxy_enum::proxy(Animal)]
mod proxy {
    use super::{Cat, Foo, Lion, Mouse};

    enum Animal {
        Cat(Cat<Foo>),
        Lion(Lion),
        Mouse(Mouse),
    }

    impl Animal {
        #[implement]
        fn feed(&self) {}
    }
}

This would expand to:

mod proxy {
    use super::{Cat, Foo, Lion, Mouse};
    enum Animal {
        Cat(Cat<Foo>),
        Lion(Lion),
        Mouse(Mouse),
    }
    impl Animal {
        fn feed(&self) {
            match self {
                Self::Cat(__self) => <Cat<Foo>>::feed(__self),
                Self::Lion(__self) => <Lion>::feed(__self),
                Self::Mouse(__self) => <Mouse>::feed(__self),
            }
        }
    }
    impl From<Cat<Foo>> for Animal {
        fn from(from: Cat<Foo>) -> Self {
            Animal::Cat(from)
        }
    }
    impl From<Lion> for Animal {
        fn from(from: Lion) -> Self {
            Animal::Lion(from)
        }
    }
    impl From<Mouse> for Animal {
        fn from(from: Mouse) -> Self {
            Animal::Mouse(from)
        }
    }
}

The < and > around the type are only added for inherent implementations, not trait implementations.

AlephAlpha avatar Jun 06 '21 05:06 AlephAlpha

Sorry for my username. It's just a coincidence.

AlephAlpha avatar Jun 06 '21 05:06 AlephAlpha