Modules

Multiplexing multiple protocols over a single channel and dispatching to session handler instances.

Macros

This macro is convenient for server-like protocols of the form:

The repr_bound macro creates a type alias that can be used a bound for the generic wire type and list all messages used by the protocol.

The repr_impl macro creates Repr implementations for a typed used on the wire, for each protocol message type enumerated in the call.

Structs

A session typed channel. P is the protocol and E is the environment, containing potential recursion targets. R is the representation of messages, which could be DynMessage, or perhaps something we know statically how to turn into JSON or bytes.

Active choice between P and Q

End of communication session (epsilon)

Passive choice (offer) between P and Q

Enter a recursive environment.

Receive T, then resume with protocol P.

Peano numbers: Increment

Send T, then resume with protocol P.

Recurse. N indicates how many layers of the recursive environment we recurse out of.

Peano numbers: Zero

Enums

Indicate whether the left or right choice was chosen in an Offer.

Traits

The HasDual trait defines the dual relationship between protocols.

Indicate that a protocol will receive a message, and specify what type it is, so we can decide in an offer which arm we got a message for.

Indicate that a protocol will send a message.

Define for the wire representation, so that the raw messages can be lifted into it, and later the representation can be cast back into the expected types.

Functions

Similar to session_channel; create a typed channel for a protocol P, but instead of creating a channel for its dual, return the raw sender and receiver that can be used to communicate with the channel created.

Type Definitions

We can use a dynamic boxed message to pass messages, and represent all messages in a protocol as individual structs. However if we want to send them over a network connection we will need to serialise to some wire format, and at that point we have to use tagging, so we can recognise what type to deserialise into.