rm_lines/
layer.rs

1use crate::{Line, Parse};
2
3use nom::{combinator::map, multi::length_count, number::complete::le_u32};
4
5/// Data representation of a layer in a reMarkable document page
6#[derive(Debug, PartialEq)]
7pub struct Layer {
8    pub lines: Vec<Line>,
9}
10
11impl<'i> Parse<'i> for Layer {
12    /// Attempts to parse a `Layer` from a byte sequence
13    ///
14    /// A layer is represented by a little-endian, 32-bit line count,
15    /// followed by the raw [Line] values themselves
16    fn parse(input: &'i [u8]) -> nom::IResult<&'i [u8], Self> {
17        map(length_count(le_u32, Line::parse), |lines| Layer { lines })(input)
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    #[test]
26    fn test_parse() {
27        let bytes = include_bytes!("../data/test-layer.rm");
28
29        let res = Layer::parse(bytes);
30        assert!(res.is_ok());
31
32        let (rest, layer) = res.unwrap();
33        assert_eq!(rest, &[][..]);
34        assert_eq!(layer.lines.len(), 2);
35    }
36}