onenote_parser/onenote/
page_series.rs

1use crate::errors::{ErrorKind, Result};
2use crate::fsshttpb::data::exguid::ExGuid;
3use crate::one::property_set::page_series_node;
4use crate::onenote::page::{parse_page, Page};
5use crate::onestore::OneStore;
6
7/// A series of page.
8///
9/// See [\[MS-ONE\] 1.3.2] and [\[MS-ONE\] 2.2.18].
10///
11/// [\[MS-ONE\] 1.3.2]: https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-one/2dd687ac-f36b-4723-b959-4d60c8a90ca9
12/// [\[MS-ONE\] 2.2.18]: https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-one/e2957d3b-a2a8-4756-8662-4e67fefa9f4e
13#[derive(Clone, Debug)]
14pub struct PageSeries {
15    pages: Vec<Page>,
16}
17
18impl PageSeries {
19    /// The pages contained in this page series.
20    pub fn pages(&self) -> &[Page] {
21        &self.pages
22    }
23}
24
25pub(crate) fn parse_page_series(id: ExGuid, store: &OneStore) -> Result<PageSeries> {
26    let object = store
27        .data_root()
28        .get_object(id)
29        .ok_or_else(|| ErrorKind::MalformedOneNoteData("page series object is missing".into()))?;
30    let data = page_series_node::parse(object)?;
31
32    let pages = data
33        .page_spaces
34        .into_iter()
35        .map(|page_space_id| {
36            store
37                .object_space(page_space_id)
38                .ok_or_else(|| ErrorKind::MalformedOneNoteData("page space is missing".into()))
39        })
40        .map(|page_space| parse_page(page_space?))
41        .collect::<Result<_>>()?;
42
43    Ok(PageSeries { pages })
44}