rusty_chat/common/protocol/
message.rs

1pub mod client;
2pub mod server;
3
4use std::fmt::{Debug, Display};
5
6use crate::common::protocol::{error::MessageParseError, serializable::Serializable};
7
8#[derive(Clone, Debug, PartialEq)]
9pub enum Message {
10    Client(client::Message),
11    Server(server::Message),
12}
13
14impl Message {
15    fn id(&self) -> u8 {
16        match self {
17            Message::Client(_) => 0,
18            Message::Server(_) => 1,
19        }
20    }
21}
22
23impl Display for Message {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        match self {
26            Message::Client(message) => write!(f, "Client({})", message),
27            Message::Server(message) => write!(f, "Server({})", message),
28        }
29    }
30}
31
32impl Serializable for Message {
33    fn as_bytes(&self) -> Vec<u8> {
34        let mut bytes = Vec::new();
35
36        match self {
37            Message::Client(message) => {
38                bytes.push(self.id());
39                bytes.extend(message.as_bytes());
40            }
41            Message::Server(message) => {
42                bytes.push(self.id());
43                bytes.extend(message.as_bytes());
44            }
45        }
46
47        bytes
48    }
49
50    fn from_bytes(bytes: &[u8]) -> Result<Message, MessageParseError> {
51        if bytes.is_empty() {
52            return Err(MessageParseError::MessageEmpty);
53        }
54
55        let message_kind = bytes[0];
56        match message_kind {
57            0 => Ok(Message::Client(client::Message::from_bytes(&bytes[1..])?)),
58            1 => Ok(Message::Server(server::Message::from_bytes(&bytes[1..])?)),
59            _ => Err(MessageParseError::UnknownKind(message_kind)),
60        }
61    }
62}
63
64//TODO: Tests