use thiserror::Error;
#[cfg(doc)]
use crate::protocol;
use crate::protocol::Square;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
#[error("notification is too short: expected at least {expected} bytes, got {actual}")]
pub struct NotificationTooShortError {
pub expected: usize,
pub actual: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
pub enum BatteryStatusError {
#[error("invalid charging flag {0:#04x}: expected 0 or 1")]
InvalidChargingFlag(u8),
#[error("invalid battery percentage {0}: expected a value from 0 through 100")]
InvalidBatteryPercentage(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
pub enum PieceStatusError {
#[error("invalid tracked-piece identity {value:#04x} at index {index}")]
InvalidTrackedPiece {
index: usize,
value: u8,
},
#[error(
"invalid tracked-piece battery percentage {value} at index {index}: expected 0 through 100 or 0xff for unavailable"
)]
InvalidTrackedPieceBattery {
index: usize,
value: u8,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
pub enum DecodeResponseNotificationError {
#[error(transparent)]
NotificationTooShort(#[from] NotificationTooShortError),
#[error(transparent)]
PieceStatus(#[from] PieceStatusError),
#[error(transparent)]
BatteryStatus(#[from] BatteryStatusError),
#[error("unexpected notification type {0:#04x}")]
UnexpectedNotification(u8),
#[error(
"invalid notification header byte at offset {offset}: expected {expected:#04x}, got {actual:#04x}"
)]
InvalidNotificationHeader {
offset: usize,
expected: u8,
actual: u8,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
pub enum DecodePositionNotificationError {
#[error(transparent)]
NotificationTooShort(#[from] NotificationTooShortError),
#[error("invalid piece value {value:#04x} at square {square}")]
InvalidPiece {
square: Square,
value: u8,
},
}