postscript/compact1/
offset.rs1use crate::Result;
2
3#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
5pub struct Offset(pub u32);
6
7pub 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}