flams_math_archives/
document_file.rs

1use 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    /// # Errors
25    #[inline]
26    pub fn get_document(&self) -> Result<Document, ReadError> {
27        self.document.get(&self.reader)
28    }
29
30    /// # Errors
31    #[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    /// # Errors
38    #[inline]
39    pub fn get_html(&self) -> Result<Box<str>, ReadError> {
40        self.html.get(&self.reader)
41    }
42
43    /// # Errors
44    #[inline]
45    pub fn get_css(&self) -> Box<[Css]> {
46        self.css.get().clone()
47    }
48
49    /// # Errors
50    pub fn get_html_body(&self) -> Result<Box<str>, ReadError> {
51        self.get_html_range(*self.body.get())
52    }
53
54    /// # Errors
55    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    /// # Errors
63    #[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    /// # Errors
69    #[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) //.get_range(&self.reader, start, end)
76    }
77
78    /// # Errors
79    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}