boox_note_parser/
virtual_page.rs

1use crate::{
2    error::Result,
3    id::PageUuid,
4    json::Dimensions,
5    utils::{convert_timestamp_to_datetime, parse_json},
6};
7
8#[derive(Debug, Clone)]
9pub struct VirtualPage {
10    pub page_id: PageUuid,
11    pub created: chrono::DateTime<chrono::Utc>,
12    pub modified: chrono::DateTime<chrono::Utc>,
13    pub zoom_scale: f32,
14    pub dimensions: Dimensions,
15    pub layout: Dimensions,
16    pub geo: Dimensions,
17    pub geo_layout: String,
18    pub template_path: String,
19    pub page_number: String,
20}
21
22impl VirtualPage {
23    pub fn read(mut reader: impl std::io::Read) -> Result<Self> {
24        let container = protobuf::VirtualPageContainer::read(&mut reader)?;
25        Ok(Self {
26            page_id: PageUuid::from_str(&container.virtual_page.page_uuid)?,
27            created: convert_timestamp_to_datetime(container.virtual_page.created)?,
28            modified: convert_timestamp_to_datetime(container.virtual_page.modified)?,
29            zoom_scale: container.virtual_page.zoom_scale,
30            dimensions: parse_json(&container.virtual_page.dimensions_json)?,
31            layout: parse_json(&container.virtual_page.layout_json)?,
32            geo: parse_json(&container.virtual_page.geo_json)?,
33            geo_layout: container.virtual_page.geo_layout.clone(),
34            template_path: container.virtual_page.template_path.clone(),
35            page_number: container.virtual_page.page_number.clone(),
36        })
37    }
38}
39
40pub mod protobuf {
41    use prost::Message;
42
43    use crate::error::Result;
44
45    #[derive(Clone, PartialEq, Message)]
46    pub struct VirtualPageContainer {
47        #[prost(message, required, tag = "1")]
48        pub virtual_page: VirtualPage,
49    }
50
51    impl VirtualPageContainer {
52        pub fn read(mut reader: impl std::io::Read) -> Result<Self> {
53            let mut buf = Vec::new();
54            reader.read_to_end(&mut buf)?;
55
56            Ok(VirtualPageContainer::decode(&buf[..])?)
57        }
58    }
59
60    #[derive(Clone, PartialEq, Message)]
61    pub struct VirtualPage {
62        // Confirmed
63        #[prost(string, tag = "1")]
64        pub page_uuid: String,
65        // Confirmed
66        #[prost(uint64, tag = "2")]
67        pub created: u64,
68        // Confirmed
69        #[prost(uint64, tag = "3")]
70        pub modified: u64,
71        // Uncertain
72        #[prost(float, tag = "4")]
73        pub zoom_scale: f32,
74        // Uncertain
75        #[prost(string, tag = "6")]
76        pub dimensions_json: String,
77        // Uncertain
78        #[prost(string, tag = "7")]
79        pub layout_json: String,
80        // Uncertain
81        #[prost(string, tag = "8")]
82        pub geo_json: String,
83        // Uncertain
84        #[prost(string, tag = "9")]
85        pub geo_layout: String,
86        // Confirmed
87        #[prost(string, tag = "10")]
88        pub template_path: String,
89        // Uncertain
90        #[prost(string, tag = "12")]
91        pub page_number: String,
92    }
93}