postscript/compact1/
offset.rs

1use crate::Result;
2
3/// An offset.
4#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
5pub struct Offset(pub u32);
6
7/// An offset size.
8pub type OffsetSize = u8;
9
10impl crate::walue::Read<'static> for Offset {
11    type Parameter = OffsetSize;
12
13    fn read<T: crate::tape::Read>(tape: &mut T, size: OffsetSize) -> Result<Self> {
14        Ok(Offset(match size {
15            1 => tape.take::<u8>()? as u32,
16            2 => tape.take::<u16>()? as u32,
17            3 => {
18                let value: [u8; 3] = tape.take()?;
19                u32::from_be_bytes([0, value[0], value[1], value[2]])
20            }
21            4 => tape.take::<u32>()?,
22            _ => raise!("found a malformed offset"),
23        }))
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use std::io::Cursor;
30
31    use crate::compact1::Offset;
32    use crate::walue::Read;
33
34    #[test]
35    fn read() {
36        let mut tape = Cursor::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
37
38        assert_eq!(Offset::read(&mut tape, 1).unwrap().0, 0x01);
39        assert_eq!(Offset::read(&mut tape, 2).unwrap().0, 0x0203);
40        assert_eq!(Offset::read(&mut tape, 3).unwrap().0, 0x040506);
41        assert_eq!(Offset::read(&mut tape, 4).unwrap().0, 0x0708090a);
42    }
43}