#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FrameError {
Empty,
InvalidPrefix(char),
MalformedChecksum,
BadChecksum { expected: u8, computed: u8 },
MalformedTagBlock,
BadTagChecksum { expected: u8, computed: u8 },
TooShort,
NonAsciiAddress,
}
impl core::fmt::Display for FrameError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Empty => write!(f, "empty input"),
Self::InvalidPrefix(c) => write!(f, "invalid prefix '{c}', expected '$' or '!'"),
Self::MalformedChecksum => write!(f, "checksum is not valid hexadecimal"),
Self::BadChecksum { expected, computed } => {
write!(
f,
"checksum mismatch: expected {expected:02X}, computed {computed:02X}"
)
}
Self::MalformedTagBlock => write!(f, "malformed IEC 61162-450 tag block"),
Self::BadTagChecksum { expected, computed } => {
write!(
f,
"tag block checksum mismatch: expected {expected:02X}, computed {computed:02X}"
)
}
Self::TooShort => write!(f, "sentence too short"),
Self::NonAsciiAddress => write!(f, "address field contains non-ASCII bytes"),
}
}
}
impl std::error::Error for FrameError {}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EncodeError {
InvalidPrefix(char),
NonAsciiAddress,
EmptySentenceType,
InvalidFieldCharacter(char),
InvalidCoordinate,
InvalidAisField(&'static str),
AisTextTooLong {
field: &'static str,
max_chars: usize,
actual_chars: usize,
},
MissingAisSequenceId,
TooManyAisFragments,
}
impl core::fmt::Display for EncodeError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::InvalidPrefix(c) => write!(f, "invalid prefix '{c}', expected '$' or '!'"),
Self::NonAsciiAddress => write!(f, "talker or sentence type is not ASCII"),
Self::EmptySentenceType => write!(f, "sentence type is empty"),
Self::InvalidFieldCharacter(c) => {
write!(f, "field contains invalid character {c:?}")
}
Self::InvalidCoordinate => {
write!(f, "coordinate magnitude is NaN, infinite, or negative")
}
Self::InvalidAisField(field) => write!(f, "invalid AIS field {field}"),
Self::AisTextTooLong {
field,
max_chars,
actual_chars,
} => write!(
f,
"AIS field {field} is too long: {actual_chars} characters, maximum {max_chars}"
),
Self::MissingAisSequenceId => {
write!(
f,
"multi-fragment AIS payload requires a sequential message ID"
)
}
Self::TooManyAisFragments => {
write!(
f,
"AIS payload exceeds the five-fragment transmission limit"
)
}
}
}
}
impl std::error::Error for EncodeError {}