use crate::protocol::{IncompatFlags, MavLinkVersion, MessageId};
mod io_error;
pub use io_error::{IoError, IoErrorKind};
#[doc(inline)]
pub use mavspec::rust::spec::SpecError;
#[cfg(all(feature = "msrv-utils-mission", feature = "unstable"))]
#[doc(inline)]
pub use crate::microservices::mission::MissionError;
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Clone, Debug)]
#[cfg_attr(all(feature = "specta", feature = "unstable"), derive(specta::Type))]
#[cfg_attr(
all(feature = "specta", feature = "unstable"),
specta(rename = "MavioError")
)]
#[cfg_attr(
all(feature = "serde", feature = "unstable"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(feature = "std", derive(thiserror::Error))]
pub enum Error {
#[cfg_attr(feature = "std", error("I/O error: {0:?}"))]
Io(IoError),
#[cfg_attr(feature = "std", error("frame decoding/encoding error: {0:?}"))]
Frame(FrameError),
#[cfg_attr(feature = "std", error("frame decoding/encoding error: {0:?}"))]
Spec(SpecError),
#[cfg_attr(feature = "std", error("mission error: {0:?}"))]
#[cfg(all(feature = "msrv-utils-mission", feature = "unstable"))]
Mission(MissionError),
}
#[derive(Clone, Debug)]
#[cfg_attr(all(feature = "specta", feature = "unstable"), derive(specta::Type))]
#[cfg_attr(
all(feature = "serde", feature = "unstable"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(feature = "std", derive(thiserror::Error))]
pub enum FrameError {
#[cfg_attr(feature = "std", error("invalid MAVLink version: {0:?}"))]
Version(VersionError),
#[cfg_attr(feature = "std", error("checksum validation failed"))]
Checksum,
#[cfg_attr(feature = "std", error("signature validation failed"))]
Signature,
#[cfg_attr(feature = "std", error("invalid incompat flags: {0:?}"))]
Incompatible(IncompatFlagsError),
#[cfg_attr(feature = "std", error("message with ID {0:?} is not in dialect"))]
NotInDialect(MessageId),
#[cfg_attr(
feature = "std",
error("the frame buffer is too small, expecting: {expected} bytes, actual: {actual}")
)]
FrameBufferIsTooSmall {
expected: usize,
actual: usize,
},
#[cfg_attr(feature = "std", error("invalid MAVLink header"))]
InvalidHeader,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(all(feature = "specta", feature = "unstable"), derive(specta::Type))]
#[cfg_attr(
all(feature = "serde", feature = "unstable"),
derive(serde::Serialize, serde::Deserialize)
)]
pub struct VersionError {
pub expected: MavLinkVersion,
pub actual: MavLinkVersion,
}
pub struct ChecksumError;
pub struct SignatureError;
#[derive(Copy, Clone, Debug)]
#[cfg_attr(all(feature = "specta", feature = "unstable"), derive(specta::Type))]
#[cfg_attr(
all(feature = "serde", feature = "unstable"),
derive(serde::Serialize, serde::Deserialize)
)]
pub struct IncompatFlagsError {
pub expected: IncompatFlags,
pub actual: IncompatFlags,
}
impl From<VersionError> for FrameError {
#[inline(always)]
fn from(value: VersionError) -> Self {
Self::Version(value)
}
}
impl From<VersionError> for Error {
#[inline(always)]
fn from(value: VersionError) -> Self {
FrameError::from(value).into()
}
}
impl From<ChecksumError> for FrameError {
#[inline(always)]
fn from(_: ChecksumError) -> Self {
Self::Checksum
}
}
impl From<ChecksumError> for Error {
#[inline(always)]
fn from(value: ChecksumError) -> Self {
FrameError::from(value).into()
}
}
impl From<SignatureError> for FrameError {
#[inline(always)]
fn from(_: SignatureError) -> Self {
Self::Signature
}
}
impl From<SignatureError> for Error {
#[inline(always)]
fn from(value: SignatureError) -> Self {
FrameError::from(value).into()
}
}
impl From<IncompatFlagsError> for FrameError {
#[inline(always)]
fn from(value: IncompatFlagsError) -> Self {
Self::Incompatible(value)
}
}
impl From<IncompatFlagsError> for Error {
#[inline(always)]
fn from(value: IncompatFlagsError) -> Self {
FrameError::from(value).into()
}
}
impl From<FrameError> for Error {
#[inline(always)]
fn from(value: FrameError) -> Self {
Self::Frame(value)
}
}
impl From<SpecError> for Error {
fn from(value: SpecError) -> Self {
if let SpecError::NotInDialect(id) = value {
Error::Frame(FrameError::NotInDialect(id))
} else {
Self::Spec(value)
}
}
}
#[cfg(all(feature = "msrv-utils-mission", feature = "unstable"))]
impl From<MissionError> for Error {
#[inline(always)]
fn from(value: MissionError) -> Self {
Error::Mission(value)
}
}