Expand description

This crate provides a set of procedural macros for deriving traits for multi-sender types, which are structs that contain multiple Sender and AsyncSender fields. The structs can either have named fields or be a tuple struct.

The derive macros provided by this crate allows multi-senders to be created from anything that behaves like all of the individual senders, and allows the multi-sender to be used like any of the individual senders. This can be very useful when one component needs to send multiple kinds of messages to another component; for example the networking layer needs to send multiple types of messages to the ClientActor, each expecting a different response; it would be very cumbersome to have to construct the PeerManagerActor by passing in 10 different sender objects, so instead we create a multi-sender interface of all the senders and pass that in instead.

To better understand these macros,

  • Look at the tests in this crate for examples of what the macros generate.
  • Search for usages of the derive macros in the codebase.

Derive Macros§

  • Derives the ability to use this struct of Senders and AsyncSenders to call .send or .send_async directly as if using one of the included Senders or AsyncSenders.
  • Derives two enums, whose names are based on this struct by appending Message and Input. Each enum has a case for each Sender or AsyncSender in this struct. The Message enum contains the raw message being sent, which is X for Sender<X> and MessageWithCallback<X, Y> for AsyncSender<X, Y>. The Input enum contains the same for Sender but only the input, X for AsyncSender<X, Y>.
  • Derives the ability to convert an object into this struct of Sender and AsyncSenders, as long as the object can be converted into each individual Sender or AsyncSender. The conversion is done by calling .as_multi_sender() or .into_multi_sender().