protocol-dchat.md 1.9 KB

ProtocolDchat

Let's start tying these concepts together. We'll define a struct called ProtocolDchat that contains a MessageSubscription to DchatMsg and a pointer to the ProtocolJobsManager. We'll also include the DchatMsgsBuffer in the struct as it will come in handy later on.

{{#include ../../../../../example/dchat/dchatd/src/protocol_dchat.rs:protocol_dchat}}

Next we'll implement the trait ProtocolBase. ProtocolBase requires two functions, start and name. In start we will start up the ProtocolJobsManager. name will return a str of the protocol name.

#[async_trait]
impl net::ProtocolBase for ProtocolDchat {
    async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
        self.jobsman.clone().start(executor.clone());
        Ok(())
    }

    fn name(&self) -> &'static str {
        "ProtocolDchat"
    }
}

Once that's done, we'll need to create a ProtocolDchat constructor that we will pass to the ProtocolRegistry to register our protocol. We'll invoke the MessageSubsystem and add DchatMsg as to the list of dispatchers. Next, we'll create a MessageSubscription to DchatMsg using the method subscribe_msg.

We'll also initialize the ProtocolJobsManager and finally return a pointer to the protocol.

{{#include ../../../../../example/dchat/dchatd/src/protocol_dchat.rs:constructor}}

We're nearly there. But right now the protocol doesn't actually do anything. Let's write a method called handle_receive_msg which receives a message on our MessageSubscription and adds it to DchatMsgsBuffer.

Put this inside the ProtocolDchat implementation:

{{#include ../../../../../example/dchat/dchatd/src/protocol_dchat.rs:receive}}

As a final step, let's add that task to the ProtocolJobManager that is invoked in start:

{{#include ../../../../../example/dchat/dchatd/src/protocol_dchat.rs:start}}