rusty_chat/common/protocol/
message.rs1pub 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