summaryrefslogtreecommitdiffstats
path: root/src/osc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/osc.rs')
-rw-r--r--src/osc.rs47
1 files changed, 33 insertions, 14 deletions
diff --git a/src/osc.rs b/src/osc.rs
index f9a8df1..fdbcb0e 100644
--- a/src/osc.rs
+++ b/src/osc.rs
@@ -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(())
}