From 9cc5983223885161c76f02d34be947e677adafb4 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 22 Mar 2023 07:11:23 -0600 Subject: [PATCH] I DID THE THING --- src/engine.rs | 53 ++++++++++++++++++++++++++++----------------------- src/main.rs | 2 +- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/engine.rs b/src/engine.rs index 52e1651..b28a73a 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -121,25 +121,15 @@ impl InputEngine for InputEngineUDP { self.last_socket = Some(std::net::UdpSocket::bind(addr).unwrap()); } - let result = self._get(); - + let mut buf = [0; 128]; + let result = self.last_socket.as_ref().unwrap().recv_from(&mut buf); if result.is_err() { self.last_socket = None; return Vec::::new(); } - return result.unwrap(); - } -} - -impl InputEngineUDP { - fn _get(&mut self) -> Result, std::io::Error> { - let mut buf = [0; 128]; - if !self.last_socket.is_some() { - return Ok(Vec::::new()); - } - let (amt, _) = self.last_socket.as_ref().unwrap().recv_from(&mut buf)?; + let (amt, _) = result.unwrap(); let buf = &mut buf[..amt]; - return Ok(std::str::from_utf8(buf).unwrap().chars().collect()); + return std::str::from_utf8(buf).unwrap().chars().collect(); } } @@ -191,7 +181,7 @@ mod test_input { } pub trait OutputEngine { - fn put(&self, v: Vec); + fn put(&mut self, v: Vec); } pub fn build_output_engine(cfg: &Engine) -> Result, String> { @@ -205,7 +195,7 @@ pub fn build_output_engine(cfg: &Engine) -> Result, String struct OutputEngineStdout {} impl OutputEngine for OutputEngineStdout { - fn put(&self, v: Vec) { + fn put(&mut self, v: Vec) { println!("{}", v.iter().cloned().collect::()); } } @@ -216,22 +206,23 @@ mod test_output { struct OutputEngineTest {} impl OutputEngine for OutputEngineTest { - fn put(&self, _v: Vec) { + fn put(&mut self, _v: Vec) { } } #[test] fn test_output_engine_impl() { - let output_engine_test = OutputEngineTest{}; - _test_output_engine_impl(&output_engine_test); + let mut output_engine_test = OutputEngineTest{}; + _test_output_engine_impl(&mut output_engine_test); } - fn _test_output_engine_impl(engine: &dyn OutputEngine) { + fn _test_output_engine_impl(engine: &mut dyn OutputEngine) { engine.put("teehee".to_string().chars().collect()); } } struct OutputEngineUDP { + last_socket: Option, host: String, port: i32, } @@ -239,15 +230,29 @@ struct OutputEngineUDP { pub fn build_output_engine_udp(cfg: &Engine) -> Result, String> { let udp_cfg = cfg.udp.as_ref().unwrap(); return Ok(Box::new(OutputEngineUDP{ + last_socket: None, host: udp_cfg.host.clone().unwrap(), port: udp_cfg.port, })); } impl OutputEngine for OutputEngineUDP { - fn put(&self, v: Vec) { - let socket = std::net::UdpSocket::bind("127.0.0.1:".to_string() + &(self.port+10).to_string()).unwrap(); - socket.connect(self.host.to_string() + ":" + &self.port.to_string()).unwrap(); - socket.send(&v.iter().cloned().collect::().as_bytes()).unwrap(); + fn put(&mut self, v: Vec) { + if self.last_socket.is_none() { + let result = std::net::UdpSocket::bind("127.0.0.1:".to_string() + &(self.port+10).to_string()); + if result.is_err() { + return; + } + self.last_socket = Some(result.unwrap()); + if self.last_socket.as_ref().unwrap().connect(self.host.to_string() + ":" + &self.port.to_string()).is_err() { + self.last_socket = None; + return; + } + } + + let result = self.last_socket.as_ref().unwrap().send(&v.iter().cloned().collect::().as_bytes()); + if result.is_err() { + self.last_socket = None; + } } } diff --git a/src/main.rs b/src/main.rs index 72f48ee..ef4fe41 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ fn main() { println!("{:?} => {}", cfg.streams.input.engine.name, input_engine.is_ok()); println!("{:?} => {}", cfg.streams.output.engine.name, output_engine.is_ok()); let mut input_engine = input_engine.unwrap(); - let output_engine = output_engine.unwrap(); + let mut output_engine = output_engine.unwrap(); loop { output_engine.put(input_engine.get()); }