use std::array::TryFromSliceError;
use crazyflie_link::Packet;
use futures::task::SpawnError;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
ProtocolVersionNotSupported {
min_supported: u8,
max_supported: u8,
found: u8,
},
ProtocolError(String),
ParamError(String),
LogError(String),
ConversionError(String),
LinkError(crazyflie_link::Error),
Disconnected,
VariableNotFound,
SystemError(String),
AppchannelPacketTooLarge,
InvalidArgument(String),
Timeout,
MemoryError(String),
InvalidParameter(String),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::ProtocolVersionNotSupported { min_supported, max_supported, found } => {
write!(f, "Protocol version not supported: supported range is {}-{}, found {}", min_supported, max_supported, found)
}
Error::ProtocolError(msg) => write!(f, "Protocol error: {}", msg),
Error::ParamError(msg) => write!(f, "Parameter error: {}", msg),
Error::LogError(msg) => write!(f, "Log error: {}", msg),
Error::ConversionError(msg) => write!(f, "Conversion error: {}", msg),
Error::LinkError(e) => write!(f, "Link error: {}", e),
Error::Disconnected => write!(f, "Disconnected"),
Error::VariableNotFound => write!(f, "Variable not found"),
Error::SystemError(msg) => write!(f, "System error: {}", msg),
Error::AppchannelPacketTooLarge => write!(f, "Appchannel packet too large"),
Error::InvalidArgument(msg) => write!(f, "Invalid argument: {}", msg),
Error::Timeout => write!(f, "Operation timed out"),
Error::MemoryError(msg) => write!(f, "Memory error: {}", msg),
Error::InvalidParameter(msg) => write!(f, "Invalid parameter: {}", msg),
}
}
}
impl std::error::Error for Error {}
impl From<TryFromSliceError> for Error {
fn from(e: TryFromSliceError) -> Self {
Self::ConversionError(format!("{:?}", e))
}
}
impl From<crazyflie_link::Error> for Error {
fn from(error: crazyflie_link::Error) -> Self {
Self::LinkError(error)
}
}
impl From<SpawnError> for Error {
fn from(error: SpawnError) -> Self {
Self::SystemError(format!("{}", error))
}
}
impl From<flume::RecvError> for Error {
fn from(_: flume::RecvError) -> Self {
self::Error::Disconnected
}
}
impl From<flume::SendError<Packet>> for Error {
fn from(_: flume::SendError<Packet>) -> Self {
self::Error::Disconnected
}
}