diff --git a/crates/servicepoint/examples/wiping_clear.rs b/crates/servicepoint/examples/wiping_clear.rs index 6fd202e..6d85724 100644 --- a/crates/servicepoint/examples/wiping_clear.rs +++ b/crates/servicepoint/examples/wiping_clear.rs @@ -4,7 +4,7 @@ use std::time::Duration; use clap::Parser; -use servicepoint::{bitvec::prelude::BitVec, *}; +use servicepoint::*; #[derive(Parser, Debug)] struct Cli { diff --git a/crates/servicepoint/src/command.rs b/crates/servicepoint/src/command.rs index 8d42530..462e448 100644 --- a/crates/servicepoint/src/command.rs +++ b/crates/servicepoint/src/command.rs @@ -212,21 +212,27 @@ pub enum Command { } /// Err values for [Command::try_from]. -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, thiserror::Error)] pub enum TryFromPacketError { /// the contained command code does not correspond to a known command + #[error("The command code {0:?} does not correspond to a known command")] InvalidCommand(u16), /// the expected payload size was n, but size m was found + #[error("the expected payload size was {0}, but size {1} was found")] UnexpectedPayloadSize(usize, usize), /// Header fields not needed for the command have been used. /// /// Note that these commands would usually still work on the actual display. + #[error("Header fields not needed for the command have been used")] ExtraneousHeaderValues, /// The contained compression code is not known. This could be of disabled features. + #[error("The compression code {0:?} does not correspond to a known compression algorithm.")] InvalidCompressionCode(u16), /// Decompression of the payload failed. This can be caused by corrupted packets. + #[error("The decompression of the payload failed")] DecompressionFailed, /// The given brightness value is out of bounds + #[error("The given brightness value {0} is out of bounds.")] InvalidBrightness(u8), } diff --git a/crates/servicepoint/src/connection.rs b/crates/servicepoint/src/connection.rs index 721583c..087afd7 100644 --- a/crates/servicepoint/src/connection.rs +++ b/crates/servicepoint/src/connection.rs @@ -1,5 +1,5 @@ -use std::fmt::Debug; use crate::packet::Packet; +use std::fmt::Debug; /// A connection to the display. /// @@ -34,20 +34,26 @@ pub enum Connection { /// [servicepoint-websocket-relay]: https://github.com/kaesaecracker/servicepoint-websocket-relay #[cfg(feature = "protocol_websocket")] WebSocket( - std::sync::Arc, - >>>, + std::sync::Arc< + std::sync::Mutex< + tungstenite::WebSocket< + tungstenite::stream::MaybeTlsStream, + >, + >, + >, ), /// A fake connection for testing that does not actually send anything. Fake, } -#[derive(Debug)] +#[derive(Debug, thiserror::Error)] pub enum SendError { - IoError(std::io::Error), + #[error("IO error occurred while sending")] + IoError(#[from] std::io::Error), #[cfg(feature = "protocol_websocket")] - WebsocketError(tungstenite::Error), + #[error("WebSocket error occurred while sending")] + WebsocketError(#[from] tungstenite::Error), } impl Connection { @@ -103,7 +109,9 @@ impl Connection { let request = ClientRequestBuilder::new(uri).into_client_request()?; let (sock, _) = connect(request)?; - Ok(Self::WebSocket(std::sync::Arc::new(std::sync::Mutex::new(sock)))) + Ok(Self::WebSocket(std::sync::Arc::new(std::sync::Mutex::new( + sock, + )))) } /// Send something packet-like to the display. Usually this is in the form of a Command. @@ -157,7 +165,9 @@ impl Drop for Connection { fn drop(&mut self) { #[cfg(feature = "protocol_websocket")] if let Connection::WebSocket(sock) = self { - _ = sock.try_lock().map(move |mut sock| sock.close(None).unwrap() ); + _ = sock + .try_lock() + .map(move |mut sock| sock.close(None).unwrap()); } } } diff --git a/crates/servicepoint/src/cp437.rs b/crates/servicepoint/src/cp437.rs index 194e3f6..bfd8b5a 100644 --- a/crates/servicepoint/src/cp437.rs +++ b/crates/servicepoint/src/cp437.rs @@ -10,16 +10,14 @@ use std::collections::HashMap; /// The encoding is currently not enforced. pub type Cp437Grid = PrimitiveGrid; -/// Errors that can occur when loading CP-437. -#[derive(Debug, PartialEq)] -pub enum Cp437LoadError { - /// Invalid character in input prevented loading - InvalidChar { - /// invalid character is at this position in input - index: usize, - /// the invalid character - char: char, - }, +/// The error occurring when loading an invalid character +#[derive(Debug, PartialEq, thiserror::Error)] +#[error("The character {char:?} at position {index} is not a valid CP437 character")] +pub struct InvalidCharError { + /// invalid character is at this position in input + index: usize, + /// the invalid character + char: char, } impl Cp437Grid { @@ -33,7 +31,7 @@ impl Cp437Grid { value: &str, width: usize, wrap: bool, - ) -> Result { + ) -> Result { assert!(width > 0); assert!(!value.is_empty()); @@ -43,7 +41,7 @@ impl Cp437Grid { for (index, char) in value.chars().enumerate() { if !char.is_ascii() { - return Err(Cp437LoadError::InvalidChar { index, char }); + return Err(InvalidCharError { index, char }); } let is_lf = char == '\n'; @@ -199,7 +197,7 @@ mod tests { #[test] fn load_ascii_invalid() { assert_eq!( - Err(Cp437LoadError::InvalidChar { + Err(InvalidCharError { char: '🥶', index: 2 }),