#[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))
}
}