vmc 0.6.0

Implementation of Virtual Motion Capture protocol for virtual avatar tracking.
Documentation
use std::{
	fmt,
	io::{self}
};

#[derive(Debug)]
pub enum Error {
	Io(io::Error),
	Osc(rosc::OscError),
	UnimplementedMessage(String, Vec<rosc::OscType>),
	UnknownBone(String),
	UnknownBlendShape(String),
	UnknownModelState(i32),
	UnknownCalibrationState(i32),
	UnknownCalibrationMode(i32),
	UnknownTrackingState(i32)
}

impl fmt::Display for Error {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		match self {
			Error::Io(err) => write!(f, "socket error: {err}"),
			Error::Osc(err) => write!(f, "protocol error: {err}"),
			Error::UnimplementedMessage(addr, args) => write!(f, "handling '{addr}' not implemented (args: {args:?})"),
			Error::UnknownBone(bone) => write!(f, "unknown bone: {bone}"),
			Error::UnknownBlendShape(blend_shape) => write!(f, "unknown blend shape: {blend_shape}"),
			Error::UnknownModelState(state) => write!(f, "unknown model state: {state}"),
			Error::UnknownCalibrationState(state) => write!(f, "unknown calibration state: {state}"),
			Error::UnknownCalibrationMode(mode) => write!(f, "unknown calibration mode: {mode}"),
			Error::UnknownTrackingState(state) => write!(f, "unknown tracking state: {state}")
		}
	}
}

impl From<io::Error> for Error {
	fn from(value: io::Error) -> Self {
		Self::Io(value)
	}
}
impl From<rosc::OscError> for Error {
	fn from(value: rosc::OscError) -> Self {
		Self::Osc(value)
	}
}

impl std::error::Error for Error {
	fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
		match self {
			Error::Io(err) => Some(err),
			Error::Osc(err) => err.source(),
			_ => None
		}
	}
}

pub type Result<T, E = Error> = std::result::Result<T, E>;