use alloc::{format, string::ToString, vec::Vec};
use std::net::{SocketAddr, UdpSocket};
use crate::{OscArg, OscError, OscMessage, OscPacket, encode};
pub struct OscSender {
socket: UdpSocket,
target: SocketAddr,
}
impl OscSender {
pub fn connect(target: &str) -> Result<Self, OscError> {
let socket =
UdpSocket::bind("0.0.0.0:0").map_err(|e| OscError(format!("bind failed: {e}")))?;
let target: SocketAddr = target
.parse()
.map_err(|e| OscError(format!("invalid address '{target}': {e}")))?;
Ok(OscSender { socket, target })
}
pub fn send(&self, packet: &OscPacket) -> Result<(), OscError> {
let data = encode(packet);
log::trace!("OscSender: sending {} bytes to {}", data.len(), self.target);
self.socket
.send_to(&data, self.target)
.map(|_| ())
.map_err(|e| OscError(format!("send failed: {e}")))
}
pub fn send_message(&self, address: &str, args: Vec<OscArg>) -> Result<(), OscError> {
self.send(&OscPacket::Message(OscMessage {
address: address.to_string(),
args,
}))
}
}