use std::ops::Range;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
CursorEof(std::io::Error),
SerializeError(&'static str, Box<Error>),
DeserializeError(&'static str, Box<Error>),
MessageTooShort {
message: Vec<u8>,
min_len: usize,
},
MessageSizeInvalid {
message: Vec<u8>,
allowed_size: Range<usize>,
},
InvalidArtnetHeader(Vec<u8>),
OpcodeError(&'static str, Box<Error>),
UnknownOpcode(u16),
InvalidPortAddress(i32),
}
impl std::fmt::Display for Error {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Error::CursorEof(inner) => write!(fmt, "Cursor EOF: {}", inner),
Error::SerializeError(message, inner) => write!(fmt, "{}: {}", message, inner),
Error::DeserializeError(message, inner) => write!(fmt, "{}: {}", message, inner),
Error::MessageTooShort { message, min_len } => write!(
fmt,
"Message too short, it was {} but artnet expects at least {}",
message.len(),
min_len
),
Error::MessageSizeInvalid {
message,
allowed_size,
} => write!(
fmt,
"Message size invalid, it was {} but artnet expects between {} and {}",
message.len(),
allowed_size.start,
allowed_size.end
),
Error::InvalidArtnetHeader(_) => write!(fmt, "Invalid artnet header"),
Error::OpcodeError(opcode, inner) => {
write!(fmt, "Could not parse opcode {:?}: {}", opcode, inner)
}
Error::UnknownOpcode(opcode) => write!(fmt, "Unknown opcode 0x{:X}", opcode),
Error::InvalidPortAddress(wrong_number) => write!(
fmt,
"Art-Net PortAddress must be from 0 to 32_767. Got {:?}",
wrong_number
),
}
}
}
impl std::error::Error for Error {}