chat_room_server/
chat_room_server.rs

1use easy_esp::{Request, RequestHandler, Server, Response, ServerCMD};
2use std::net::SocketAddr;
3
4
5// Creating a obj that implements request handler for chat room
6struct ChatRoomHandler {
7    clients: Vec<SocketAddr>,
8}
9impl ChatRoomHandler {
10    fn new() -> Self {
11        ChatRoomHandler {
12            clients: vec![],
13        }
14    }
15}
16impl RequestHandler for ChatRoomHandler {
17    fn handle_request(&mut self, request: Request, origin: SocketAddr) -> (Response, Option<ServerCMD>) {
18
19        let response = format!("Ok");
20
21        let cmd = ServerCMD::SendAll(format!("{}: {}", origin, request));
22        (response, Some(cmd))
23    }
24    
25    fn client_connect(&mut self, addr: SocketAddr) -> Option<ServerCMD> {
26        // Adds client to client list
27        self.clients.push(addr);
28        
29        Some(ServerCMD::SendAll(format!("{} Connected to chat", addr)))
30    }
31    
32    fn client_disconnect(&mut self, addr: SocketAddr) -> Option<ServerCMD> {
33        // Removes addr if it matches disconnected one
34        self.clients.retain(|&x| x != addr);
35
36        Some(ServerCMD::SendAll(format!("{} Disconnect from chat", addr)))
37    }
38}
39
40#[tokio::main]
41async fn main() {
42    // Getting a socket addr obj
43    let addr: SocketAddr = "127.0.0.1:5555".parse().expect("Could not parse ip addr");
44
45    // Creating instance of a handler
46    let handler = ChatRoomHandler::new();
47
48    // Creating a server obj
49    let mut server = Server::new(addr, handler);
50
51    // Start server listener
52    server.listen().await;
53}