I want to propagate a generic trait methods to a enum wrapper like this:
trait State<T>: Sized {
fn next(self) -> T;
}
enum Machine {
One(One),
}
impl From<One> for Machine {
fn from(src: One) -> Self {
Self::One(src)
}
}
impl State<Machine> for Machine {
fn next(self) -> Self {
match self {
Self::One(state) => state.next(),
}
}
}
struct One;
impl State<Machine> for One {
fn next(self) -> Machine {
self.into()
}
}
fn main() {
let m = Machine::One(One);
m.next();
}
But I can't figure out how to express this with enum_dispatch
. This won't compile and cargo expand
says enum_dispatch
doesn't do anything:
use enum_dispatch::enum_dispatch;
#[enum_dispatch]
trait State<T>: Sized {
fn next(self) -> T;
}
#[enum_dispatch(State)]
enum Machine {
One(One),
}
struct One;
impl State<Machine> for One {
fn next(self) -> Machine {
self.into() // the trait `From<One>` is not implemented for `Machine`
}
}
fn main() {
let m = Machine::One(One);
m.next(); // method not found in `Machine`
}