ping_server/
ping_server.rs

1//! Server side of script
2use easy_sockets::{
3    error::{deserialize_error, serialize_error, ErrorCode},
4    start_server, tokio, Deserialize, Serialize, ServerConn,
5};
6
7/// Error codes for server client connection
8enum PingError {
9    BadRequest,
10    InternalServerError,
11}
12impl ErrorCode for PingError {
13    fn to_code(&self) -> u16 {
14        match self {
15            PingError::BadRequest => 400,
16            PingError::InternalServerError => 500,
17        }
18    }
19
20    fn from_code(code: u16) -> Option<Self> {
21        Some(match code {
22            400 => PingError::BadRequest,
23            500 => PingError::InternalServerError,
24            _ => return None,
25        })
26    }
27
28    fn message(&self) -> &'static str {
29        match self {
30            PingError::BadRequest => "Request provided was invalid.",
31            PingError::InternalServerError => "Server encountered unexpected internal error.",
32        }
33    }
34}
35
36/// Message that a Client sends
37#[derive(Serialize, Deserialize)]
38enum ClientMsg {
39    Ping(String),
40}
41
42/// Message that the server sends
43#[derive(Serialize, Deserialize)]
44enum ServerMsg {
45    #[serde(
46        serialize_with = "serialize_error",
47        deserialize_with = "deserialize_error"
48    )]
49    Error(PingError),
50    Ping(String),
51}
52
53/// An instance between a server and client
54struct ServerInstance {
55    response: String,
56}
57impl ServerConn for ServerInstance {
58    type ClientMsg = ClientMsg;
59    type ServerMsg = ServerMsg;
60
61    fn handle_message(&mut self, message: Self::ClientMsg) -> Self::ServerMsg {
62        match message {
63            ClientMsg::Ping(message) => {
64                println!("Received From Client: {}", message);
65                ServerMsg::Ping(self.response.clone())
66            }
67        }
68    }
69
70    fn new() -> Self {
71        Self {
72            response: "Hello Client".into(),
73        }
74    }
75}
76
77#[tokio::main]
78async fn main() {
79    let _ = start_server::<ServerInstance>("127.0.0.1:8000").await;
80}