flams_math_archives/
document_file.rs1use std::path::PathBuf;
2
3use crate::utils::{
4 AsyncEngine,
5 errors::ReadError,
6 lazy_file::{BytesField, EagerField, LazyField, LazyFile, StreamField},
7};
8use ftml_ontology::{
9 narrative::{DocumentRange, documents::Document},
10 utils::Css,
11};
12
13#[derive(Debug)]
14pub struct DocumentFile {
15 reader: LazyFile<6>,
16 body: EagerField<DocumentRange, 0>,
17 inner_offset: EagerField<u32, 1>,
18 css: EagerField<Box<[Css]>, 2>,
19 data: BytesField<3>,
20 document: LazyField<Document, 4>,
21 html: StreamField<5>,
22}
23impl DocumentFile {
24 #[inline]
26 pub fn get_document(&self) -> Result<Document, ReadError> {
27 self.document.get(&self.reader)
28 }
29
30 #[inline]
32 #[allow(clippy::future_not_send)]
33 pub async fn get_document_async<A: AsyncEngine>(&self) -> Result<Document, ReadError> {
34 self.document.get_async::<A, _>(&self.reader).await
35 }
36
37 #[inline]
39 pub fn get_html(&self) -> Result<Box<str>, ReadError> {
40 self.html.get(&self.reader)
41 }
42
43 #[inline]
45 pub fn get_css(&self) -> Box<[Css]> {
46 self.css.get().clone()
47 }
48
49 pub fn get_html_body(&self) -> Result<Box<str>, ReadError> {
51 self.get_html_range(*self.body.get())
52 }
53
54 pub fn get_html_body_inner(&self) -> Result<Box<str>, ReadError> {
56 let mut range = *self.body.get();
57 range.start += *self.inner_offset.get() as usize;
58 range.end -= "</body>".len();
59 self.get_html_range(range)
60 }
61
62 #[inline]
64 pub fn get_html_range(&self, range: DocumentRange) -> Result<Box<str>, ReadError> {
65 self.html.get_range(&self.reader, range.start, range.end)
66 }
67
68 #[inline]
70 pub fn get_data<T: bincode::de::Decode<()>>(
71 &self,
72 start: usize,
73 end: usize,
74 ) -> Result<T, ReadError> {
75 self.data.deserialize_range(&self.reader, start, end) }
77
78 pub fn from_file(path: PathBuf) -> Result<Self, ReadError> {
80 let data = BytesField;
81 let document = LazyField::default();
82 let html = StreamField;
83 let (reader, (body, css, inner_offset)) = LazyFile::new_and_then(path, |mut reader| {
84 let body = EagerField::new(&mut reader)?;
85 let inner_offset = EagerField::new(&mut reader)?;
86 let css = EagerField::new(&mut reader)?;
87 Ok((body, css, inner_offset))
88 })?;
89 Ok(Self {
90 reader,
91 body,
92 inner_offset,
93 css,
94 data,
95 document,
96 html,
97 })
98 }
99}
100#[cfg(feature = "deepsize")]
101impl deepsize::DeepSizeOf for DocumentFile {
102 fn deep_size_of_children(&self, context: &mut deepsize::Context) -> usize {
103 self.css
104 .get()
105 .iter()
106 .map(|c| match c {
107 Css::Class { name, css } => name.len() + css.len(),
108 Css::Inline(s) | Css::Link(s) => s.len(),
109 })
110 .sum::<usize>()
111 + self.document.deep_size_of_children(context)
112 }
113}