use errors;
use std::result;
#[derive(Clone, Debug, PartialEq)]
pub enum OscType {
Int(i32),
Float(f32),
String(String),
Blob(Vec<u8>),
Time(u32, u32),
Long(i64),
Double(f64),
Char(char),
Color(OscColor),
Midi(OscMidiMessage),
Bool(bool),
Array(OscArray),
Nil,
Inf,
}
macro_rules! value_impl {
($(($name:ident, $variant:ident, $ty:ty)),*) => {
$(
impl OscType {
#[allow(dead_code)]
pub fn $name(self) -> Option<$ty> {
match self {
OscType::$variant(v) => Some(v),
_ => None
}
}
}
impl From<$ty> for OscType {
fn from(v: $ty) -> Self {
OscType::$variant(v)
}
}
)*
}
}
value_impl! {
(int, Int, i32),
(float, Float, f32),
(string, String, String),
(blob, Blob, Vec<u8>),
(array, Array, OscArray),
(long, Long, i64),
(double, Double, f64),
(char, Char, char),
(color, Color, OscColor),
(midi, Midi, OscMidiMessage),
(bool, Bool, bool)
}
impl From<(u32, u32)> for OscType {
fn from(time: (u32, u32)) -> Self {
OscType::Time(time.0, time.1)
}
}
impl OscType {
#[allow(dead_code)]
pub fn time(self) -> Option<(u32, u32)> {
match self {
OscType::Time(sec, frac) => Some((sec, frac)),
_ => None,
}
}
}
impl<'a> From<&'a str> for OscType {
fn from(string: &'a str) -> Self {
OscType::String(string.to_string())
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct OscMidiMessage {
pub port: u8,
pub status: u8,
pub data1: u8,
pub data2: u8,
}
#[derive(Clone, Debug, PartialEq)]
pub enum OscPacket {
Message(OscMessage),
Bundle(OscBundle),
}
#[derive(Clone, Debug, PartialEq)]
pub struct OscMessage {
pub addr: OscAddress,
pub args: Option<Vec<OscType>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum OscAddress {
Int(u32),
String(String),
}
#[derive(Clone, Debug, PartialEq)]
pub struct OscBundle {
pub timetag: OscType,
pub content: Vec<OscPacket>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct OscColor {
pub red: u8,
pub green: u8,
pub blue: u8,
pub alpha: u8,
}
#[derive(Clone, Debug, PartialEq)]
pub struct OscArray {
pub content: Vec<OscType>,
}
pub type Result<T> = result::Result<T, errors::OscError>;
impl From<String> for OscMessage {
fn from(s: String) -> OscMessage {
OscMessage {
addr: OscAddress::String(s),
args: None,
}
}
}
impl<'a> From<&'a str> for OscMessage {
fn from(s: &str) -> OscMessage {
OscMessage {
addr: OscAddress::String(s.to_string()),
args: None,
}
}
}
impl std::fmt::Display for OscAddress {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
OscAddress::Int(i) => write!(f, "{}", i),
OscAddress::String(ref s) => write!(f, "\"{}\"", s),
}
}
}