From 4c801733c4d89d91448f5940cbbc6c9d4d528dad Mon Sep 17 00:00:00 2001 From: Silvio Braendle Date: Mon, 27 Jan 2025 12:09:02 +0100 Subject: [PATCH] Use traits and implement them --- src/client_handler.rs | 18 +++++++++++++----- src/dispatcher.rs | 14 ++++++++++---- src/main.rs | 6 +++--- src/ui_app.rs | 6 +++--- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/client_handler.rs b/src/client_handler.rs index 2944eca..8d294b4 100644 --- a/src/client_handler.rs +++ b/src/client_handler.rs @@ -8,9 +8,7 @@ pub struct BindError { type Result = std::result::Result; -pub struct ClientHandler; - -impl ClientHandler { +pub trait ClientHandler { fn handle_message(msg: Message) { match msg { Message::PlaySound(play_sound) => { @@ -18,8 +16,18 @@ impl ClientHandler { } } } +} - pub fn listen(port: u16) -> Result<()> { +pub trait Listener : ClientHandler { + fn listen(port: u16) -> Result<()>; +} + +pub struct NetworkListener; + +impl ClientHandler for NetworkListener {} + +impl Listener for NetworkListener { + fn listen(port: u16) -> Result<()> { let bind_addr = format!("0.0.0.0:{}", port); let socket = UdpSocket::bind(bind_addr); let socket = match socket { @@ -39,7 +47,7 @@ impl ClientHandler { println!("Received {} bytes from {}", amt, src); let data = &mut data[..amt]; let msg = bincode::deserialize::(data).expect("Failed to deserialize"); - ClientHandler::handle_message(msg); + NetworkListener::handle_message(msg); } } } diff --git a/src/dispatcher.rs b/src/dispatcher.rs index 02607aa..c2f1898 100644 --- a/src/dispatcher.rs +++ b/src/dispatcher.rs @@ -8,20 +8,26 @@ use rodio::{Decoder, Source}; use crate::protocol::{Message, PlaySound}; -pub struct Dispatcher; +pub trait Dispatcher { + fn handle_dispatch(addrs: Vec, sound_path: String); +} -impl Dispatcher { +pub struct NetworkDispatcher; + +impl NetworkDispatcher { fn load_sound(path: String) -> Decoder> { let file = BufReader::new(File::open(path).unwrap()); Decoder::new(file).unwrap() } +} - pub fn handle_dispatch_sample(addrs: Vec, sound_path: String) { +impl Dispatcher for NetworkDispatcher { + fn handle_dispatch(addrs: Vec, sound_path: String) { let now = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap(); - let source = Dispatcher::load_sound(sound_path).buffered(); + let source = NetworkDispatcher::load_sound(sound_path).buffered(); let channels = source.channels(); let sample_rate = source.sample_rate(); diff --git a/src/main.rs b/src/main.rs index a5566a5..fc80f00 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release -use client_handler::ClientHandler; +use client_handler::{Listener, NetworkListener}; use std::thread; use ui_app::UIApp; @@ -20,13 +20,13 @@ fn main() -> eframe::Result { }; thread::spawn(move || { - let result = ClientHandler::listen(3000); + let result = NetworkListener::listen(3000); match result { Ok(_) => {} Err(e) => { eprintln!("Failed to bind: {}", e.message); // Try with port 3001 - let result = ClientHandler::listen(3001); + let result = NetworkListener::listen(3001); match result { Ok(_) => {} Err(e) => { diff --git a/src/ui_app.rs b/src/ui_app.rs index 37b8ca2..eee3b9c 100644 --- a/src/ui_app.rs +++ b/src/ui_app.rs @@ -1,4 +1,4 @@ -use crate::dispatcher::Dispatcher; +use crate::dispatcher::{Dispatcher, NetworkDispatcher}; use eframe::egui; use rfd::FileDialog; use std::path::PathBuf; @@ -30,7 +30,7 @@ impl eframe::App for UIApp { ui.text_edit_singleline(address); if ui.button("Play sound").clicked() { if let Some(path) = &self.picked_file { - Dispatcher::handle_dispatch_sample( + NetworkDispatcher::handle_dispatch( vec![address.clone()], path.to_str().unwrap().to_owned(), ); @@ -66,7 +66,7 @@ impl eframe::App for UIApp { if ui.button("Play sound").clicked() { if let Some(path) = &self.picked_file { - Dispatcher::handle_dispatch_sample( + NetworkDispatcher::handle_dispatch( self.addresses.clone(), path.to_str().unwrap().to_owned(), );