Skip to main content

quillmark_core/
session.rs

1use crate::{Diagnostic, RenderError, RenderOptions, RenderResult};
2
3#[doc(hidden)]
4pub trait SessionHandle: Send + Sync {
5    fn render(&self, opts: &RenderOptions) -> Result<RenderResult, RenderError>;
6    fn page_count(&self) -> usize;
7}
8
9/// Opaque, backend-backed iterative render session.
10pub struct RenderSession {
11    inner: Box<dyn SessionHandle>,
12    warning: Option<Diagnostic>,
13}
14
15impl RenderSession {
16    #[doc(hidden)]
17    pub fn new(inner: Box<dyn SessionHandle>) -> Self {
18        Self {
19            inner,
20            warning: None,
21        }
22    }
23
24    /// Attach a non-fatal warning to this session. The warning is appended to
25    /// [`RenderResult::warnings`] on each call to [`RenderSession::render`].
26    pub fn with_warning(mut self, warning: Option<Diagnostic>) -> Self {
27        self.warning = warning;
28        self
29    }
30
31    pub fn page_count(&self) -> usize {
32        self.inner.page_count()
33    }
34
35    pub fn render(&self, opts: &RenderOptions) -> Result<RenderResult, RenderError> {
36        let mut result = self.inner.render(opts)?;
37        if let Some(warning) = &self.warning {
38            result.warnings.push(warning.clone());
39        }
40        Ok(result)
41    }
42}