Fix and simplify packets

This commit is contained in:
Joscha 2022-02-11 22:11:20 +01:00
parent 7458eac931
commit 0e6acdbff4
4 changed files with 173 additions and 24 deletions

View file

@ -2,9 +2,9 @@ use serde::{Deserialize, Serialize};
use crate::{Identity, MessageId}; use crate::{Identity, MessageId};
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Message { pub struct Message {
pub pred: Option<MessageId>, pub pred: MessageId,
pub parent: Option<MessageId>, pub parent: Option<MessageId>,
pub identity: Identity, pub identity: Identity,
pub nick: String, pub nick: String,
@ -13,10 +13,7 @@ pub struct Message {
impl Message { impl Message {
pub fn id(&self) -> MessageId { pub fn id(&self) -> MessageId {
let pred = match self.pred { let pred = self.pred;
Some(id) => format!("{id}"),
None => "none".to_string(),
};
let parent = match self.parent { let parent = match self.parent {
Some(id) => format!("{id}"), Some(id) => format!("{id}"),
None => "none".to_string(), None => "none".to_string(),

View file

@ -29,14 +29,13 @@ pub struct NickCmd {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type")] #[serde(tag = "type")]
pub enum NickRpl { pub enum NickRpl {
Success { you: User }, Success,
NickTooLong, NickTooLong,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct SendCmd { pub struct SendCmd {
pub parent: Option<MessageId>, pub parent: Option<MessageId>,
pub nick: Option<String>,
pub content: String, pub content: String,
} }
@ -49,32 +48,32 @@ pub enum SendRpl {
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct WhoCmd; pub struct WhoCmd {}
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct WhoRpl { pub struct WhoRpl {
you: User, pub you: User,
others: Vec<User>, pub others: Vec<User>,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct JoinNtf { pub struct JoinNtf {
user: User, pub user: User,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct NickNtf { pub struct NickNtf {
user: User, pub user: User,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct PartNtf { pub struct PartNtf {
user: User, pub user: User,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct SendNtf { pub struct SendNtf {
message: Message, pub message: Message,
} }
// Create a Cmd enum for all commands, a Rpl enum for all replies and a Ntf enum // Create a Cmd enum for all commands, a Rpl enum for all replies and a Ntf enum

View file

@ -2,9 +2,9 @@ use serde::{Deserialize, Serialize};
use crate::{Identity, SessionId}; use crate::{Identity, SessionId};
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Clone, Deserialize, Serialize)]
pub struct User { pub struct User {
nick: String, pub nick: String,
identity: Identity, pub identity: Identity,
sid: SessionId, pub sid: SessionId,
} }

View file

@ -1,12 +1,165 @@
use cove_core::packets::{
Cmd, HelloCmd, HelloRpl, JoinNtf, NickCmd, NickNtf, NickRpl, Ntf, Packet, PartNtf, Rpl,
SendCmd, SendNtf, SendRpl, WhoCmd, WhoRpl,
};
use cove_core::{Identity, Message, MessageId, SessionId, User};
use futures::{future, StreamExt, TryStreamExt}; use futures::{future, StreamExt, TryStreamExt};
use tokio::net::{TcpListener, TcpStream}; use tokio::net::{TcpListener, TcpStream};
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let listener = TcpListener::bind(("::0", 40080)).await.unwrap(); let user = User {
while let Ok((stream, _)) = listener.accept().await { nick: "Garmy".to_string(),
tokio::spawn(conn(stream)); identity: Identity::of("random garbage"),
} sid: SessionId::of("12345"),
};
let message = Message {
pred: MessageId::of("pred"),
parent: None,
identity: Identity::of("asd"),
nick: "Foo".to_string(),
content: "Bar".to_string(),
};
println!(
"{}",
serde_json::to_string_pretty(&Packet::Cmd {
id: 12345,
cmd: Cmd::Hello(HelloCmd {
nick: "Garmy".to_string(),
identity: "random garbage".to_string()
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Hello(HelloRpl::Success {
you: user.clone(),
others: vec![],
last_message: MessageId::of("Blarg")
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Hello(HelloRpl::NickTooLong)
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Cmd {
id: 12345,
cmd: Cmd::Nick(NickCmd {
nick: "Garmelon".to_string()
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Nick(NickRpl::Success)
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Nick(NickRpl::NickTooLong)
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Cmd {
id: 12345,
cmd: Cmd::Send(SendCmd {
parent: None,
// parent: Some(MessageId::of("Booh!")),
content: "Hello world!".to_string()
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Send(SendRpl::Success {
message: message.clone()
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Send(SendRpl::ContentTooLong)
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Cmd {
id: 12345,
cmd: Cmd::Who(WhoCmd {})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Rpl {
id: 67890,
rpl: Rpl::Who(WhoRpl {
you: user.clone(),
others: vec![]
})
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Ntf {
ntf: Ntf::Join(JoinNtf { user: user.clone() })
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Ntf {
ntf: Ntf::Nick(NickNtf { user: user.clone() })
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Ntf {
ntf: Ntf::Part(PartNtf { user: user.clone() })
})
.unwrap()
);
println!(
"{}",
serde_json::to_string_pretty(&Packet::Ntf {
ntf: Ntf::Send(SendNtf {
message: message.clone()
})
})
.unwrap()
);
// let listener = TcpListener::bind(("::0", 40080)).await.unwrap();
// while let Ok((stream, _)) = listener.accept().await {
// tokio::spawn(conn(stream));
// }
} }
async fn conn(stream: TcpStream) { async fn conn(stream: TcpStream) {