noodles_cram/codecs/rans_4x8/
order.rs1use std::{error, fmt};
2
3#[derive(Debug, Eq, PartialEq)]
4pub struct TryFromByteError(u8);
5
6impl fmt::Display for TryFromByteError {
7 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
8 write!(f, "invalid rANS order: expected 0 or 1, got {}", self.0)
9 }
10}
11
12impl error::Error for TryFromByteError {}
13
14#[derive(Clone, Copy, Debug, Eq, PartialEq)]
16pub enum Order {
17 Zero,
19 One,
21}
22
23impl TryFrom<u8> for Order {
24 type Error = TryFromByteError;
25 fn try_from(b: u8) -> Result<Self, Self::Error> {
26 match b {
27 0 => Ok(Self::Zero),
28 1 => Ok(Self::One),
29 _ => Err(TryFromByteError(b)),
30 }
31 }
32}
33
34impl From<Order> for u8 {
35 fn from(order: Order) -> Self {
36 order as Self
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_try_from_u8_for_order() {
46 assert_eq!(Order::try_from(0), Ok(Order::Zero));
47 assert_eq!(Order::try_from(1), Ok(Order::One));
48 assert_eq!(Order::try_from(2), Err(TryFromByteError(2)));
49 }
50
51 #[test]
52 fn test_from_order_for_u8() {
53 assert_eq!(u8::from(Order::Zero), 0);
54 assert_eq!(u8::from(Order::One), 1);
55 }
56}