define_constructor

Macro define_constructor 

Source
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,
    ));
}