From 66e4f69323e2f5f8dbdf94a246ffc5dcfc859728 Mon Sep 17 00:00:00 2001 From: Varga Marcell <128537619+marci1175@users.noreply.github.com> Date: Sat, 30 Dec 2023 14:16:22 +0100 Subject: [PATCH] code shortening --- Cargo.lock | 30 ++++ Cargo.toml | 2 + src/app/backend.rs | 139 +++++++++--------- src/app/server.rs | 13 +- .../widgets/message_tray/message_tray_main.rs | 1 + 5 files changed, 114 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca40632b..88739fa3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3980,6 +3980,12 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.15" @@ -4289,6 +4295,28 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.39", +] + [[package]] name = "subtle" version = "2.5.0" @@ -4451,6 +4479,8 @@ dependencies = [ "rust-argon2", "serde", "serde_json", + "strum", + "strum_macros", "tokio", "tonic", "tonic-build 0.10.2", diff --git a/Cargo.toml b/Cargo.toml index 941b8336..d70d8d99 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,8 @@ hound = "3.5.1" arg = "0.4.1" rodio = {version = "0.17.3", features = ["wav", "mp3", "flac"]} claxon = "0.4.3" +strum = {version = "0.25.0", features = ["derive"]} +strum_macros = "0.25.3" [dependencies.windows-sys] diff --git a/src/app/backend.rs b/src/app/backend.rs index 9b5e6acf..d165e5d0 100644 --- a/src/app/backend.rs +++ b/src/app/backend.rs @@ -3,10 +3,8 @@ use rand::rngs::ThreadRng; use rodio::{OutputStream, OutputStreamHandle, Sink}; use std::collections::BTreeMap; - use std::io; use std::io::{Read, Seek, SeekFrom}; - use std::path::PathBuf; use std::sync::atomic::AtomicBool; use std::sync::{mpsc, Arc, Mutex}; @@ -604,17 +602,36 @@ pub struct ServerAudioReply { pub file_name: String, } +use strum::{EnumDiscriminants, EnumMessage}; +use strum_macros::{EnumIter, EnumString}; + //This is what server replies can be -#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, EnumDiscriminants)] +#[strum_discriminants(derive(EnumString, EnumMessage))] pub enum ServerMessageType { + #[strum_discriminants(strum(message = "Upload"))] Upload(ServerFileUpload), + #[strum_discriminants(strum(message = "Normal"))] Normal(ServerNormalMessage), //Used to send and index to client so it knows which index to ask for VERY IMPORTANT!!!!!!!!! + #[strum_discriminants(strum(message = "Image"))] Image(ServerImageUpload), + #[strum_discriminants(strum(message = "Audio"))] Audio(ServerAudioUpload), } +// #[derive(Debug, EnumDiscriminants)] +// #[strum_discriminants(derive(EnumIter))] +// pub enum ServerMessageTypeR { +// Upload(ServerFileUpload), +// Normal(ServerNormalMessage), + +// //Used to send and index to client so it knows which index to ask for VERY IMPORTANT!!!!!!!!! +// Image(ServerImageUpload), +// Audio(ServerAudioUpload), +// } + //This is one whole server msg (packet), which gets bundled when sending ServerMain #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] pub struct ServerOutput { @@ -627,78 +644,68 @@ impl ServerOutput { pub fn struct_into_string(&self) -> String { serde_json::to_string(self).unwrap_or_default() } - pub fn convert_audio_to_servermsg(normal_msg: ClientMessage, index: i32) -> ServerOutput { - ServerOutput { - replying_to: normal_msg.replying_to, - MessageType: ServerMessageType::Audio(ServerAudioUpload { - file_name: match normal_msg.MessageType { - ClientMessageType::ClientSyncMessage(_) => todo!(), - ClientMessageType::ClientFileUpload(upload) => upload.name.unwrap_or_default(), - ClientMessageType::ClientNormalMessage(_) => todo!(), - ClientMessageType::ClientFileRequestType(_) => todo!(), - }, - index, - }), - Author: normal_msg.Author, - MessageDate: normal_msg.MessageDate, - } - } - pub fn convert_msg_to_servermsg(normal_msg: ClientMessage) -> ServerOutput { - //Convert a client output to a server output (ClientMessage -> ServerOutput), trim some useless info - ServerOutput { - replying_to: normal_msg.replying_to, - MessageType: ServerMessageType::Normal(ServerNormalMessage { - message: match normal_msg.MessageType { - ClientMessageType::ClientSyncMessage(_) => todo!(), - ClientMessageType::ClientFileUpload(_) => todo!(), - ClientMessageType::ClientNormalMessage(msg) => msg.message, - ClientMessageType::ClientFileRequestType(_) => todo!(), - }, - }), - Author: normal_msg.Author, - MessageDate: normal_msg.MessageDate, - } - } - pub fn convert_picture_to_servermsg(normal_msg: ClientMessage, index: i32) -> ServerOutput { - //Convert a client output to a server output (ClientMessage -> ServerOutput), trim some useless info - ServerOutput { - replying_to: normal_msg.replying_to, - MessageType: ServerMessageType::Image(ServerImageUpload { - index: match normal_msg.MessageType { - ClientMessageType::ClientSyncMessage(_) => todo!(), - ClientMessageType::ClientFileUpload(_upload) => index, - ClientMessageType::ClientNormalMessage(_) => todo!(), - ClientMessageType::ClientFileRequestType(_) => todo!(), - }, - }), - Author: normal_msg.Author, - MessageDate: normal_msg.MessageDate, - } - } - pub fn convert_upload_to_servermsg(normal_msg: ClientMessage, index: i32) -> ServerOutput { - //Convert a client output to a server output (ClientMessage -> ServerOutput), trim some useless info + pub fn convert_type_to_servermsg( + normal_msg: ClientMessage, + index: i32, + //Automaticly generated enum by strum + upload_type: ServerMessageTypeDiscriminants, + ) -> ServerOutput { ServerOutput { replying_to: normal_msg.replying_to, - MessageType: ServerMessageType::Upload(ServerFileUpload { - file_name: match normal_msg.MessageType { - ClientMessageType::ClientSyncMessage(_) => todo!(), - ClientMessageType::ClientFileUpload(msg) => { - format!( - "{}.{}", - msg.name.unwrap_or_default(), - msg.extension.unwrap_or_default() + MessageType: + match normal_msg.MessageType { + ClientMessageType::ClientFileRequestType(_) => unimplemented!("Converting Sync packets isnt implemented, because they shouldnt be displayed to the client"), + ClientMessageType::ClientFileUpload(upload) => { + match upload_type { + ServerMessageTypeDiscriminants::Upload => { + ServerMessageType::Upload( + ServerFileUpload { + file_name: format!( + "{}.{}", + upload.name.unwrap_or_default(), + upload.extension.unwrap_or_default() + ), + index: index, + } + ) + }, + ServerMessageTypeDiscriminants::Normal => unreachable!(), + ServerMessageTypeDiscriminants::Image => { + ServerMessageType::Image( + ServerImageUpload { + index: index, + } + ) + }, + ServerMessageTypeDiscriminants::Audio => { + ServerMessageType::Audio( + ServerAudioUpload { + index: index, + file_name: format!( + "{}.{}", + upload.name.unwrap_or_default(), + upload.extension.unwrap_or_default() + ), + } + ) + }, + } + }, + ClientMessageType::ClientNormalMessage(message) => { + ServerMessageType::Normal( + ServerNormalMessage { + message: message.message, + } ) - } - ClientMessageType::ClientNormalMessage(_) => todo!(), - ClientMessageType::ClientFileRequestType(_) => todo!(), + }, + ClientMessageType::ClientSyncMessage(_) => unimplemented!("Converting Sync packets isnt implemented, because they shouldnt be displayed to the client"), }, - index, - }), Author: normal_msg.Author, MessageDate: normal_msg.MessageDate, } } + } //Used to put all the messages into 1 big pack (Bundling All the ServerOutput-s), Main packet, this gets to all the clients diff --git a/src/app/server.rs b/src/app/server.rs index ed5de9a7..bdf90ff8 100644 --- a/src/app/server.rs +++ b/src/app/server.rs @@ -3,7 +3,7 @@ use std::{env, fs, io::Write, path::PathBuf}; use rand::Rng; use std::sync::Mutex; use tonic::{transport::Server, Request, Response, Status}; - +use super::backend::ServerMessageTypeDiscriminants::{Normal, Image, Audio, Upload}; /* use std::{io, time::Duration}; use clap::Parser; @@ -268,7 +268,7 @@ impl MessageService { pub async fn NormalMessage(&self, req: ClientMessage) { match self.messages.lock() { Ok(mut ok) => { - ok.push(ServerOutput::convert_msg_to_servermsg(req)); + ok.push(ServerOutput::convert_type_to_servermsg(req, -1, Normal)); } Err(err) => { println!("{err}") @@ -350,9 +350,10 @@ impl MessageService { match self.messages.lock() { Ok(mut ok) => { - ok.push(ServerOutput::convert_upload_to_servermsg( + ok.push(ServerOutput::convert_type_to_servermsg( request, self.original_file_paths.lock().unwrap().len() as i32 - 1, + Upload )); } Err(err) => println!("{err}"), @@ -397,9 +398,10 @@ impl MessageService { match self.messages.try_lock() { Ok(mut ok) => { - ok.push(ServerOutput::convert_picture_to_servermsg( + ok.push(ServerOutput::convert_type_to_servermsg( req.clone(), image_path_lenght as i32, + Image )); } Err(err) => println!("{err}"), @@ -441,9 +443,10 @@ impl MessageService { match self.messages.try_lock() { Ok(mut ok) => { - ok.push(ServerOutput::convert_audio_to_servermsg( + ok.push(ServerOutput::convert_type_to_servermsg( req.clone(), audio_paths_lenght as i32, + Audio, )); } Err(err) => println!("{err}"), diff --git a/src/app/ui/client_ui/widgets/message_tray/message_tray_main.rs b/src/app/ui/client_ui/widgets/message_tray/message_tray_main.rs index e25a921a..53aeae42 100644 --- a/src/app/ui/client_ui/widgets/message_tray/message_tray_main.rs +++ b/src/app/ui/client_ui/widgets/message_tray/message_tray_main.rs @@ -17,6 +17,7 @@ use std::sync::mpsc; use crate::app::backend::{ClientMessage, TemplateApp}; use crate::app::client::{self}; use crate::app::ui::client_ui::client_actions::audio_recording::audio_recroding; +use crate::app::ui::client_ui::message_instances; impl TemplateApp { pub fn message_tray(