onenote_parser/one/property/
ink_dimensions.rs

1use crate::errors::{ErrorKind, Result};
2use crate::one::property::PropertyType;
3use crate::onestore::object::Object;
4use crate::reader::Reader;
5use crate::shared::guid::Guid;
6
7/// The dimensions (X or Y) for an ink stroke with lower and upper limits.
8#[allow(dead_code)]
9pub(crate) struct InkDimension {
10    pub(crate) id: Guid,
11    pub(crate) limit_lower: i32,
12    pub(crate) limit_upper: i32,
13}
14
15impl InkDimension {
16    pub(crate) fn parse(prop_type: PropertyType, object: &Object) -> Result<Vec<InkDimension>> {
17        let data = match object.props().get(prop_type) {
18            Some(value) => value.to_vec().ok_or_else(|| {
19                ErrorKind::MalformedOneNoteFileData("ink dimensions is not a vec".into())
20            })?,
21            None => return Ok(Vec::new()),
22        };
23
24        data.chunks_exact(32)
25            .map(InkDimension::parse_entry)
26            .collect::<Result<Vec<_>>>()
27    }
28
29    fn parse_entry(data: &[u8]) -> Result<InkDimension> {
30        let mut reader = Reader::new(data);
31        let id = Guid::parse(&mut reader)?;
32        let limit_lower = reader.get_u32()? as i32;
33        let limit_upper = reader.get_u32()? as i32;
34
35        Ok(InkDimension {
36            id,
37            limit_lower,
38            limit_upper,
39        })
40    }
41}