use rustwave::{Result, Server};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct ChatMessage {
room: String,
text: String,
}
#[tokio::main]
async fn main() -> Result<()> {
let server = Server::bind("127.0.0.1:8080");
server.on("connection", |_data, ctx| async move {
println!("client connected: {}", ctx.get_socket_id());
});
server.on("disconnect", |_data, ctx| async move {
println!("client disconnected: {}", ctx.get_socket_id());
});
server.on("join-room", |payload, ctx| async move {
let room = payload.parse::<String>().unwrap_or_default();
if room.is_empty() {
return;
}
ctx.join_room(&room);
println!("{} joined room: {}", ctx.get_socket_id(), room);
});
server.on("chat", |payload, ctx| async move {
let msg = match payload.parse::<ChatMessage>() {
Ok(m) => m,
Err(_) => return,
};
let _ = ctx
.broadcast_to_expect(&msg.room, ctx.get_socket_id(), "chat", msg.text)
.await;
});
println!("Listening on ws://127.0.0.1:8080");
server.run().await?;
Ok(())
}