use alloc::format;
use std::net::UdpSocket;
use crate::{OscError, OscPacket, decode};
pub struct OscReceiver {
socket: UdpSocket,
}
impl OscReceiver {
pub fn bind(addr: &str) -> Result<Self, OscError> {
UdpSocket::bind(addr)
.map(|socket| OscReceiver { socket })
.map_err(|e| OscError(format!("bind failed: {e}")))
}
pub fn recv(&self) -> Result<OscPacket, OscError> {
let mut buf = [0u8; 65536];
let (n, _) = self
.socket
.recv_from(&mut buf)
.map_err(|e| OscError(format!("recv failed: {e}")))?;
log::trace!("OscReceiver: received {} bytes", n);
decode(&buf[..n])
}
pub fn set_timeout(&self, timeout: Option<std::time::Duration>) -> Result<(), OscError> {
self.socket
.set_read_timeout(timeout)
.map_err(|e| OscError(format!("set_timeout failed: {e}")))
}
}