macro_rules! event_enum {
    ($(#[$attrs:meta])* $enu:ident | $($evt_name:ident => $iface:ty),*) => { ... };
    ($(#[$attrs:meta])* $enu:ident | $($evt_name:ident => $iface:ty),* | $($name:ident => $value:ty),*) => { ... };
}
Expand description

Generate an enum joining several objects events

This macro allows you to easily create a enum type for use with your message Filters. It is used like so:

event_enum!(
    MyEnum |
    Pointer => WlPointer,
    Keyboard => WlKeyboard,
    Surface => WlSurface
);

This will generate the following enum, unifying the events from each of the provided interface:

pub enum MyEnum {
    Pointer { event: WlPointer::Event, object: Main<WlPointer> },
    Keyboard { event: WlKeyboard::Event, object: Main<WlKeyboard> },
    Surface { event: WlSurface::Event, object: Main<WlSurface> }
}

It will also generate the appropriate From<_> implementation so that a Filter<MyEnum> can be used as an implementation for WlPointer, WlKeyboard and WlSurface.

If you want to add custom messages to the enum, the macro also supports it:

event_enum!(
    MyEnum |
    Pointer => WlPointer,
    Keyboard => WlKeyboard,
    Surface => WlSurface |
    MyMessage => SomeType,
    OtherMessage => OtherType
);

will generate the following enum:

pub enum MyEnum {
    Pointer { event: WlPointer::Event, object: Main<WlPointer> },
    Keyboard { event: WlKeyboard::Event, object: Main<WlKeyboard> },
    Surface { event: WlSurface::Event, object: Main<WlSurface> },
    MyMessage(SomeType),
    OtherMessage(OtherType)
}

as well as implementations of From<SomeType> and From<OtherType>, so that these types can directly be provided into a Filter<MyEnum>.