use crate::core::FieldKind;
use thiserror_no_std::Error;
#[derive(Error, Debug)]
pub enum CanIdBuildError {
#[error("Invalid data")]
InvalidData,
#[error("Invalid destination")]
InvalidDestination,
#[error("Invalid for broadcast message: PF is too low")]
InvalidForBroadcast,
#[error("Invalid for addressed message: PF is too high: {pgn}")]
InvalidForFocusedMessage { pgn: u8 },
#[error("PDU1 PGNs require PS = 0")]
PsFocusMessageMustBeNull,
#[error("Payload is empty: unable to build")]
EmptyPayload,
}
#[derive(Error, Debug)]
pub enum ClaimError<E: core::fmt::Debug> {
#[error("CAN bus send error: {0:?}")]
SendError(E),
#[error("CAN bus receive error: {0:?}")]
ReceiveError(E),
#[error(transparent)]
Fault(#[from] ClaimFault),
}
#[derive(Error, Debug)]
pub enum ClaimFault {
#[error("Inconsistent match between IsoName and Address Claim Strategy")]
InconsistentStrategy,
#[error("Request address claim error")]
RequestAddressClaimErr,
#[error(transparent)]
Extraction(#[from] ExtractionError),
}
#[derive(Debug, Error)]
pub enum ExtractionError {
#[error("Invalid incoming N2K frame")]
InvalidIncomingFrame,
#[error("Invalid data length for PGN")]
InvalidDataLen,
}
#[derive(Debug, Error)]
pub enum SerializationError {
#[error("Buffer too small")]
BufferTooSmall,
#[error("Invalid data")]
InvalidData,
#[error("Invalid repetitive PGN definition for {data}")]
RepeatitiveError { data: u32 },
#[error("Invalid field bit length for {field_name}")]
InvalidFieldBits { field_name: &'static str },
#[error("BitWrite error: {err}")]
BitWriteError { err: BitWriterError },
#[error("Unsupported field kind")]
UnsupportedFieldKind,
#[error("Field {field_id} not found")]
FieldNotFound { field_id: &'static str },
#[error("Codec Error: {source}")]
CodecError { source: CodecError },
}
#[derive(Error, Debug)]
pub enum DeserializationError {
#[error("Invalid data length")]
InvalidDataLength,
#[error("Malformed data")]
MalformedData,
#[error("Functionality not implemented for this PGN")]
NotImplemented,
#[error("Missing Indirect Lookup Reference for descriptor {desc}: {pgn}")]
MissingIndirectLookupRef { desc: u32, pgn: &'static str },
#[error("Dependency field not found {dep} for pgn {desc}")]
DependencyFieldNotFound { dep: &'static str, desc: u32 },
#[error("Unsupported field kind {field_kind:?}")]
UnsupportedFieldKind { field_kind: FieldKind },
#[error("Field assignment failed {desc}")]
FieldAssignmentFailed { desc: &'static str },
#[error("Invalid field bit length for {field_name}")]
InvalidFieldBits { field_name: &'static str },
#[error("Codec Error: {source}")]
CodecError { source: CodecError },
#[error("BitReader error: {err}")]
BitReaderError { err: BitReaderError },
}
#[derive(Error, Debug)]
pub enum CodecError {
#[error("Data type mismatch for {value_kind}, function: {func}")]
DataTypeMismatch {
value_kind: &'static str,
func: &'static str,
},
}
#[derive(Debug, Error)]
pub enum SendPgnError<E: core::fmt::Debug> {
#[error("Serialization failed")]
Serialization,
#[error("Frame build failed: {0:?}")]
Build(CanIdBuildError),
#[error("CAN bus send error: {0:?}")]
Send(E),
#[error("No address claimed")]
NotClaimed,
}
#[derive(Debug, Error)]
pub enum BitReaderError {
#[error("Attempted to read out of bounds -> asked: {asked}, available: {available}")]
OutOfBounds { asked: usize, available: usize },
#[error("Cannot read more than {max} bits. Requested: {asked}")]
TooLongForType { max: u8, asked: u8 },
#[error("Non aligned bit. Cursor: {cursor}")]
NonAlignedBit { cursor: usize },
}
#[derive(Debug, Error)]
pub enum BitWriterError {
#[error("Attempted to write out of bounds -> asked: {asked}, available: {available}")]
OutOfBounds { asked: usize, available: usize },
#[error("Cannot write more than {max} bits. Requested: {asked}")]
TooLongForType { max: u8, asked: u8 },
#[error("Non aligned bit. Cursor: {cursor}")]
NonAlignedBit { cursor: usize },
}
const _: () = assert!(core::mem::size_of::<DeserializationError>() <= 48);
const _: () = assert!(core::mem::size_of::<SerializationError>() <= 48);