use std::collections::Bound;
use std::ops::RangeBounds;
use crate::error::Error;
pub(crate) fn insufficient_data(tag: &'static str) -> impl FnOnce(std::io::Error) -> Error {
move |_| Error::insufficient_data(tag)
}
pub(crate) fn ensure_serial_version_is(expected: u8, actual: u8) -> Result<(), Error> {
if expected == actual {
Ok(())
} else {
Err(Error::deserial(format!(
"unsupported serial version: expected {expected}, got {actual}"
)))
}
}
pub(crate) fn ensure_preamble_longs_in(expected: &[u8], actual: u8) -> Result<(), Error> {
if expected.contains(&actual) {
Ok(())
} else {
Err(Error::invalid_preamble_longs(expected, actual))
}
}
pub(crate) fn ensure_preamble_longs_in_range(
expected: impl RangeBounds<u8>,
actual: u8,
) -> Result<(), Error> {
let start = expected.start_bound();
let end = expected.end_bound();
if expected.contains(&actual) {
Ok(())
} else {
Err(Error::deserial(format!(
"invalid preamble longs: expected {}, got {actual}",
match (start, end) {
(Bound::Included(a), Bound::Included(b)) => format!("[{a}, {b}]"),
(Bound::Included(a), Bound::Excluded(b)) => format!("[{a}, {b})"),
(Bound::Excluded(a), Bound::Included(b)) => format!("({a}, {b}]"),
(Bound::Excluded(a), Bound::Excluded(b)) => format!("({a}, {b})"),
(Bound::Unbounded, Bound::Included(b)) => format!("at most {b}"),
(Bound::Unbounded, Bound::Excluded(b)) => format!("less than {b}"),
(Bound::Included(a), Bound::Unbounded) => format!("at least {a}"),
(Bound::Excluded(a), Bound::Unbounded) => format!("greater than {a}"),
(Bound::Unbounded, Bound::Unbounded) => unreachable!("unbounded range"),
}
)))
}
}