WebSocketHandler

Derive Macro WebSocketHandler 

Source
#[derive(WebSocketHandler)]
Expand description

Derives the Handler trait for custom handler types.

This macro automatically implements the Handler trait for your type, delegating to a handle method that you must implement. This is useful for creating stateful handlers or handlers with complex initialization.

§Requirements

Your type must implement a method with this signature:

async fn handle(
    &self,
    message: wsforge::Message,
    conn: wsforge::Connection,
    state: wsforge::AppState,
    extensions: wsforge::Extensions,
) -> wsforge::Result<Option<wsforge::Message>>

§Examples

§Simple Handler

use wsforge_macros::WebSocketHandler;
use wsforge_core::prelude::*;

#[derive(WebSocketHandler)]
struct EchoHandler;

impl EchoHandler {
    async fn handle(
        &self,
        message: Message,
        _conn: Connection,
        _state: AppState,
        _extensions: Extensions,
    ) -> Result<Option<Message>> {
        Ok(Some(message))
    }
}

§Stateful Handler

use wsforge_macros::WebSocketHandler;
use wsforge_core::prelude::*;
use std::sync::Arc;
use tokio::sync::RwLock;

#[derive(WebSocketHandler)]
struct CounterHandler {
    count: Arc<RwLock<u64>>,
}

impl CounterHandler {
    async fn handle(
        &self,
        _message: Message,
        _conn: Connection,
        _state: AppState,
        _extensions: Extensions,
    ) -> Result<Option<Message>> {
        let mut count = self.count.write().await;
        *count += 1;
        Ok(Some(Message::text(format!("Count: {}", count))))
    }
}

§With Configuration

use wsforge_macros::WebSocketHandler;
use wsforge_core::prelude::*;

#[derive(WebSocketHandler)]
struct ConfiguredHandler {
    max_length: usize,
}

impl ConfiguredHandler {
    fn new(max_length: usize) -> Self {
        Self { max_length }
    }

    async fn handle(
        &self,
        message: Message,
        _conn: Connection,
        _state: AppState,
        _extensions: Extensions,
    ) -> Result<Option<Message>> {
        if message.as_bytes().len() > self.max_length {
            return Err(Error::custom("Message too long"));
        }
        Ok(Some(message))
    }
}