use std::any::Any;
use crate::{Diagnostic, RenderError, RenderOptions, RenderResult};
#[doc(hidden)]
pub trait SessionHandle: Any + Send + Sync {
fn render(&self, opts: &RenderOptions) -> Result<RenderResult, RenderError>;
fn page_count(&self) -> usize;
fn as_any(&self) -> &dyn Any;
}
pub struct RenderSession {
inner: Box<dyn SessionHandle>,
warnings: Vec<Diagnostic>,
}
impl RenderSession {
#[doc(hidden)]
pub fn new(inner: Box<dyn SessionHandle>) -> Self {
Self {
inner,
warnings: Vec::new(),
}
}
#[doc(hidden)]
pub fn handle(&self) -> &dyn SessionHandle {
&*self.inner
}
pub fn with_warnings(mut self, warnings: Vec<Diagnostic>) -> Self {
self.warnings = warnings;
self
}
pub fn page_count(&self) -> usize {
self.inner.page_count()
}
pub fn warnings(&self) -> &[Diagnostic] {
&self.warnings
}
pub fn render(&self, opts: &RenderOptions) -> Result<RenderResult, RenderError> {
let mut result = self.inner.render(opts)?;
result.warnings.extend(self.warnings.iter().cloned());
Ok(result)
}
}