use bevy::prelude::*;
use rosc::address::{Matcher, OscAddress};
use rosc::{OscError, OscMessage};
use std::collections::VecDeque;
pub trait OscMethod {
fn get_addresses(&self) -> Vec<OscAddress>;
fn receive_message(&mut self, osc_message: OscMessage);
fn match_message(&mut self, matcher: &Matcher, message: &OscMessage) -> bool {
for addr in &self.get_addresses() {
if matcher.match_address(addr) {
self.receive_message(message.clone());
return true;
}
}
false
}
}
#[derive(Component)]
pub struct MultiAddressOscMethod {
addresses: Vec<OscAddress>,
messages: VecDeque<OscMessage>,
}
impl MultiAddressOscMethod {
pub fn get_message(&mut self) -> Option<OscMessage> {
self.messages.pop_front()
}
pub fn new(addresses: Vec<String>) -> Result<Self, OscError> {
let osc_addresses: Result<Vec<OscAddress>, _> =
addresses.into_iter().map(OscAddress::new).collect();
Ok(Self {
addresses: osc_addresses?,
messages: Default::default(),
})
}
}
impl OscMethod for MultiAddressOscMethod {
fn get_addresses(&self) -> Vec<OscAddress> {
self.addresses.clone()
}
fn receive_message(&mut self, osc_message: OscMessage) {
self.messages.push_back(osc_message)
}
}
#[derive(Component)]
pub struct SingleAddressOscMethod {
address: OscAddress,
messages: VecDeque<OscMessage>,
}
impl SingleAddressOscMethod {
pub fn get_message(&mut self) -> Option<OscMessage> {
self.messages.pop_front()
}
pub fn new(address: String) -> Result<Self, OscError> {
Ok(Self {
address: OscAddress::new(address)?,
messages: Default::default(),
})
}
pub fn get_address(&self) -> OscAddress {
self.get_addresses()[0].clone()
}
}
impl OscMethod for SingleAddressOscMethod {
fn get_addresses(&self) -> Vec<OscAddress> {
vec![self.address.clone()]
}
fn receive_message(&mut self, osc_message: OscMessage) {
self.messages.push_back(osc_message)
}
}