Skip to content

Commit 3b0a320

Browse files
authored
Merge pull request #1 from Rustastic/client-commands
chat client commands
2 parents f80a9b8 + a020e43 commit 3b0a320

File tree

4 files changed

+147
-126
lines changed

4 files changed

+147
-126
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ edition = "2021"
55

66
[dependencies]
77
wg_2024 = { git = "https://github.com/WGL-2024/WGL_repo_2024.git", features = ["serialize", "debug"] }
8+
crossbeam-channel = "0.5.13"
89
serde = { version = "1.0", features = ["derive"] }
910
bincode = "1.3"

src/client_commands.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crossbeam_channel::Sender;
2+
use wg_2024::{network::NodeId, packet::Packet};
3+
#[derive(Debug, Clone)]
4+
pub enum ChatClientCommand {
5+
RemoveSender(NodeId),
6+
AddSender(NodeId, Sender<Packet>),
7+
// Crash,
8+
SendMessageTo(NodeId, String), //dest_client
9+
RegisterTo(NodeId), //dest_server
10+
GetClientListFrom(NodeId), //dest_server
11+
}
12+
#[derive(Debug, Clone)]
13+
pub enum ChatClientEvent {
14+
MessageReceived(NodeId, String), //source_client
15+
SuccessfulRegistration(NodeId), //dest_server
16+
ClientList(NodeId, Vec<NodeId>), //source_server
17+
}

src/high_level_messages.rs

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
use serde::{Deserialize, Serialize};
2+
use wg_2024::network::NodeId;
3+
4+
#[derive(Debug, Clone, Serialize, Deserialize)]
5+
pub enum ClientMessage {
6+
// Web Browser Messages
7+
GetServerType, // server_type?
8+
GetFilesList, // files_list?
9+
GetFile(String), // file?(file_id)
10+
GetMedia(String), // media?(media_id)
11+
12+
// Chat Messages
13+
RegisterToChat, // registration_to_chat
14+
GetClientList, // client_list?
15+
SendMessage {
16+
// message_for?(client_id, message)
17+
recipient_id: NodeId,
18+
content: String,
19+
},
20+
}
21+
22+
#[derive(Debug, Clone, Serialize, Deserialize)]
23+
pub enum ServerMessage {
24+
// Web Browser Responses
25+
ServerType(ServerType), // server_type!(type)
26+
FilesList(Vec<String>), // files_list!(list_of_file_ids)
27+
File {
28+
// file!(file_size, file)
29+
size: usize,
30+
content: String,
31+
},
32+
Media(Vec<u8>), // media!(media)
33+
34+
// Chat Responses
35+
SuccessfulRegistration,
36+
ClientList(Vec<NodeId>), // client_list!(list_of_client_ids)
37+
MessageReceived {
38+
// message_from!(client_id, message)
39+
sender_id: NodeId,
40+
content: String,
41+
},
42+
43+
// Error Messages
44+
ErrorRequestedNotFound, // error_requested_not_found!
45+
ErrorUnsupportedRequest, // error_unsupported_request!
46+
ErrorWrongClientId, // error_wrong_client_id!
47+
}
48+
49+
#[derive(Debug, Clone, Serialize, Deserialize)]
50+
pub enum ServerType {
51+
Text,
52+
Media,
53+
Chat,
54+
}
55+
56+
#[derive(Debug, Clone, Serialize, Deserialize)]
57+
pub struct Message {
58+
pub session_id: u64,
59+
pub source_id: NodeId,
60+
pub destination_id: NodeId,
61+
pub content: MessageContent,
62+
}
63+
64+
#[derive(Debug, Clone, Serialize, Deserialize)]
65+
pub enum MessageContent {
66+
FromClient(ClientMessage),
67+
FromServer(ServerMessage),
68+
}
69+
70+
impl Message {
71+
pub fn serialize(&self) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
72+
Ok(bincode::serialize(self)?)
73+
}
74+
75+
pub fn deserialize(bytes: &[u8]) -> Result<Self, Box<dyn std::error::Error>> {
76+
Ok(bincode::deserialize(bytes)?)
77+
}
78+
79+
pub fn new_client_message(
80+
session_id: u64,
81+
source_id: NodeId,
82+
destination_id: NodeId,
83+
content: ClientMessage,
84+
) -> Self {
85+
Self {
86+
session_id,
87+
source_id,
88+
destination_id,
89+
content: MessageContent::FromClient(content),
90+
}
91+
}
92+
93+
pub fn new_server_message(
94+
session_id: u64,
95+
source_id: NodeId,
96+
destination_id: NodeId,
97+
content: ServerMessage,
98+
) -> Self {
99+
Self {
100+
session_id,
101+
source_id,
102+
destination_id,
103+
content: MessageContent::FromServer(content),
104+
}
105+
}
106+
}
107+
108+
#[cfg(test)]
109+
mod tests {
110+
use super::*;
111+
112+
#[test]
113+
fn test_serialization() -> Result<(), Box<dyn std::error::Error>> {
114+
let message =
115+
Message::new_client_message(1, 2, 3, ClientMessage::GetFile("test.txt".to_string()));
116+
117+
let serialized = message.serialize()?;
118+
119+
let deserialized = Message::deserialize(&serialized)?;
120+
121+
assert_eq!(message.session_id, deserialized.session_id);
122+
assert_eq!(message.source_id, deserialized.source_id);
123+
assert_eq!(message.destination_id, deserialized.destination_id);
124+
125+
Ok(())
126+
}
127+
}

src/lib.rs

Lines changed: 2 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,2 @@
1-
use serde::{Deserialize, Serialize};
2-
use wg_2024::network::NodeId;
3-
4-
#[derive(Debug, Clone, Serialize, Deserialize)]
5-
pub enum ClientMessage {
6-
// Web Browser Messages
7-
GetServerType, // server_type?
8-
GetFilesList, // files_list?
9-
GetFile(String), // file?(file_id)
10-
GetMedia(String), // media?(media_id)
11-
12-
// Chat Messages
13-
RegisterToChat, // registration_to_chat
14-
GetClientList, // client_list?
15-
SendMessage {
16-
// message_for?(client_id, message)
17-
recipient_id: NodeId,
18-
content: String,
19-
},
20-
}
21-
22-
#[derive(Debug, Clone, Serialize, Deserialize)]
23-
pub enum ServerMessage {
24-
// Web Browser Responses
25-
ServerType(ServerType), // server_type!(type)
26-
FilesList(Vec<String>), // files_list!(list_of_file_ids)
27-
File {
28-
// file!(file_size, file)
29-
size: usize,
30-
content: String,
31-
},
32-
Media(Vec<u8>), // media!(media)
33-
34-
// Chat Responses
35-
ClientList(Vec<NodeId>), // client_list!(list_of_client_ids)
36-
MessageReceived {
37-
// message_from!(client_id, message)
38-
sender_id: NodeId,
39-
content: String,
40-
},
41-
42-
// Error Messages
43-
ErrorRequestedNotFound, // error_requested_not_found!
44-
ErrorUnsupportedRequest, // error_unsupported_request!
45-
ErrorWrongClientId, // error_wrong_client_id!
46-
}
47-
48-
#[derive(Debug, Clone, Serialize, Deserialize)]
49-
pub enum ServerType {
50-
TextServer,
51-
MediaServer,
52-
ChatServer,
53-
}
54-
55-
#[derive(Debug, Clone, Serialize, Deserialize)]
56-
pub struct Message {
57-
pub session_id: u64,
58-
pub source_id: NodeId,
59-
pub destination_id: NodeId,
60-
pub content: MessageContent,
61-
}
62-
63-
#[derive(Debug, Clone, Serialize, Deserialize)]
64-
pub enum MessageContent {
65-
FromClient(ClientMessage),
66-
FromServer(ServerMessage),
67-
}
68-
69-
impl Message {
70-
pub fn serialize(&self) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
71-
Ok(bincode::serialize(self)?)
72-
}
73-
74-
pub fn deserialize(bytes: &[u8]) -> Result<Self, Box<dyn std::error::Error>> {
75-
Ok(bincode::deserialize(bytes)?)
76-
}
77-
78-
pub fn new_client_message(
79-
session_id: u64,
80-
source_id: NodeId,
81-
destination_id: NodeId,
82-
content: ClientMessage,
83-
) -> Self {
84-
Self {
85-
session_id,
86-
source_id,
87-
destination_id,
88-
content: MessageContent::FromClient(content),
89-
}
90-
}
91-
92-
pub fn new_server_message(
93-
session_id: u64,
94-
source_id: NodeId,
95-
destination_id: NodeId,
96-
content: ServerMessage,
97-
) -> Self {
98-
Self {
99-
session_id,
100-
source_id,
101-
destination_id,
102-
content: MessageContent::FromServer(content),
103-
}
104-
}
105-
}
106-
107-
#[cfg(test)]
108-
mod tests {
109-
use super::*;
110-
111-
#[test]
112-
fn test_serialization() -> Result<(), Box<dyn std::error::Error>> {
113-
let message =
114-
Message::new_client_message(1, 2, 3, ClientMessage::GetFile("test.txt".to_string()));
115-
116-
let serialized = message.serialize()?;
117-
118-
let deserialized = Message::deserialize(&serialized)?;
119-
120-
assert_eq!(message.session_id, deserialized.session_id);
121-
assert_eq!(message.source_id, deserialized.source_id);
122-
assert_eq!(message.destination_id, deserialized.destination_id);
123-
124-
Ok(())
125-
}
126-
}
1+
mod client_commands;
2+
mod high_level_messages;

0 commit comments

Comments
 (0)