macro_rules! define_constructor {
($(#[$meta:meta])* $inner:ident : $inner_var:tt => fn $name:ident(), layout: $perform_layout:expr) => { ... };
($(#[$meta:meta])* $inner:ident : $inner_var:tt => fn $name:ident($typ:ty), layout: $perform_layout:expr) => { ... };
($(#[$meta:meta])* $inner:ident : $inner_var:tt => fn $name:ident( $($params:ident : $types:ty),+ ), layout: $perform_layout:expr) => { ... };
}Expand description
Defines a new message constructor for a enum variant. It is widely used in this crate to create shortcuts to create messages. Why is it needed anyway? Just to reduce boilerplate code as much as possible.
ยงExamples
The following example shows how to create message constructors for various kinds of enum variants:
// Message must be debuggable, comparable, cloneable.
#[derive(Debug, PartialEq, Clone)]
enum MyWidgetMessage {
DoSomething,
Foo(u32),
Bar { foo: u32, baz: u8 },
}
impl MyWidgetMessage {
// The first option is used to create constructors plain enum variants:
//
// enum name variant name perform layout?
// v v v v
define_constructor!(MyWidgetMessage:DoSomething => fn do_something(), layout: false);
// The second option is used to create constructors for single-arg tuple enum variants:
//
// enum name variant name arg perform layout?
// v v v v v
define_constructor!(MyWidgetMessage:Foo => fn foo(u32), layout: false);
// The third option is used to create constructors for enum variants with fields:
//
// enum name variant name arg type arg type perform layout?
// v v v v v v v v
define_constructor!(MyWidgetMessage:Bar => fn bar(foo: u32, baz: u8), layout: false);
}
fn using_messages(my_widget: Handle<UiNode>, ui: &UserInterface) {
// Send MyWidgetMessage::DoSomething
ui.send_message(MyWidgetMessage::do_something(
my_widget,
MessageDirection::ToWidget,
));
// Send MyWidgetMessage::Foo
ui.send_message(MyWidgetMessage::foo(
my_widget,
MessageDirection::ToWidget,
5,
));
// Send MyWidgetMessage::Bar
ui.send_message(MyWidgetMessage::bar(
my_widget,
MessageDirection::ToWidget,
1,
2,
));
}