diff options
Diffstat (limited to 'src/osc.rs')
| -rw-r--r-- | src/osc.rs | 47 |
1 files changed, 33 insertions, 14 deletions
@@ -1,4 +1,4 @@ -use std::net::UdpSocket; +use std::{fmt::Display, net::UdpSocket}; use rosc::{OscMessage, OscPacket}; @@ -20,16 +20,24 @@ impl OscServer { /// Drains all pending OSC messages, calling `on_message` for each. /// Returns `true` if any messages were dispatched. - pub fn poll(&mut self, mut on_message: impl FnMut(OscMessage)) -> bool { + pub fn poll<E: Display>( + &mut self, + mut on_message: impl FnMut(OscMessage) -> Result<(), E>, + ) -> bool { let mut received = false; loop { match self.socket.recv_from(&mut self.buf) { Ok((size, _addr)) => { let data = &self.buf[..size]; - match rosc::decoder::decode_udp(data) { - Ok((_, packet)) => dispatch(packet, &mut on_message), - Err(e) => log::warn!("OSC decode error: {}", e), - } + let res = rosc::decoder::decode_udp(data) + .map_err(|e| format!("OSC edecode error: {}", e)) + .and_then(|(_, packet)| { + dispatch(packet, &mut on_message).map_err(|e| e.to_string()) + }); + if let Err(e) = res { + log::warn!("{}", e); + }; + received = true; } Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => break, @@ -43,15 +51,22 @@ impl OscServer { } /// Blocks until at least one OSC message arrives, then drains all pending. - pub fn recv(&mut self, mut on_message: impl FnMut(OscMessage)) -> bool { + pub fn recv<E: Display>( + &mut self, + mut on_message: impl FnMut(OscMessage) -> Result<(), E>, + ) -> bool { self.socket.set_nonblocking(false).expect("set blocking"); match self.socket.recv_from(&mut self.buf) { Ok((size, _addr)) => { let data = &self.buf[..size]; - match rosc::decoder::decode_udp(data) { - Ok((_, packet)) => dispatch(packet, &mut on_message), - Err(e) => log::warn!("OSC decode error: {}", e), - } + let res = rosc::decoder::decode_udp(data) + .map_err(|e| format!("OSC edecode error: {}", e)) + .and_then(|(_, packet)| { + dispatch(packet, &mut on_message).map_err(|e| e.to_string()) + }); + if let Err(e) = res { + log::warn!("{}", e); + }; } Err(e) => { log::warn!("OSC recv error: {}", e); @@ -63,13 +78,17 @@ impl OscServer { } } -fn dispatch(packet: OscPacket, on_message: &mut impl FnMut(OscMessage)) { +fn dispatch<E>( + packet: OscPacket, + on_message: &mut impl FnMut(OscMessage) -> Result<(), E>, +) -> Result<(), E> { match packet { - OscPacket::Message(msg) => on_message(msg), + OscPacket::Message(msg) => on_message(msg)?, OscPacket::Bundle(bundle) => { for p in bundle.content { - dispatch(p, on_message); + dispatch(p, on_message)?; } } } + Ok(()) } |
