use rosc::{OscMessage, OscType};
use crate::core::{TuioError, TuioTime};
#[derive(Debug, Clone, Copy)]
pub(crate) struct ArgCursor<'a> {
message: &'a OscMessage,
index: usize,
}
impl<'a> ArgCursor<'a> {
pub(crate) fn new(message: &'a OscMessage, start_index: usize) -> Self {
Self {
message,
index: start_index,
}
}
pub(crate) fn next_int(&mut self) -> Result<i32, TuioError> {
match self.message.args.get(self.index) {
Some(OscType::Int(value)) => {
self.index += 1;
Ok(*value)
}
Some(_) => Err(TuioError::WrongArgumentType(
self.message.clone(),
self.index,
)),
None => Err(TuioError::MissingArguments(self.message.clone())),
}
}
pub(crate) fn next_float(&mut self) -> Result<f32, TuioError> {
match self.message.args.get(self.index) {
Some(OscType::Float(value)) => {
self.index += 1;
Ok(*value)
}
Some(_) => Err(TuioError::WrongArgumentType(
self.message.clone(),
self.index,
)),
None => Err(TuioError::MissingArguments(self.message.clone())),
}
}
pub(crate) fn next_string(&mut self) -> Result<String, TuioError> {
match self.message.args.get(self.index) {
Some(OscType::String(value)) => {
self.index += 1;
Ok(value.to_owned())
}
Some(_) => Err(TuioError::WrongArgumentType(
self.message.clone(),
self.index,
)),
None => Err(TuioError::MissingArguments(self.message.clone())),
}
}
pub(crate) fn next_time(&mut self) -> Result<TuioTime, TuioError> {
match self.message.args.get(self.index) {
Some(OscType::Time(value)) => {
self.index += 1;
Ok(TuioTime::from(*value))
}
Some(_) => Err(TuioError::WrongArgumentType(
self.message.clone(),
self.index,
)),
None => Err(TuioError::MissingArguments(self.message.clone())),
}
}
pub(crate) fn remaining(&self) -> usize {
self.message.args.len() - self.index
}
}