noodles_cram/codecs/rans_4x8/
order.rs

1use 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/// The number of bytes of context used to compute frequencies.
15#[derive(Clone, Copy, Debug, Eq, PartialEq)]
16pub enum Order {
17    /// Order-0.
18    Zero,
19    /// Order-1.
20    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}