use crate::page::{PageDimensions, RenderSize, RenderedPage};
pub trait DocumentSource: Send + Sync {
fn page_count(&self) -> usize;
fn page_dimensions(&self, page_index: usize) -> PageDimensions;
fn render_page(
&self,
page_index: usize,
target_size: RenderSize,
) -> Result<RenderedPage, DocumentError>;
fn embedded_metadata(&self) -> Option<EmbeddedMetadata>;
fn outline(&self) -> Option<Vec<OutlineEntry>>;
}
#[derive(Debug, Clone)]
pub struct EmbeddedMetadata {
pub pdfpc_data: Option<String>,
}
#[derive(Debug, Clone)]
pub struct OutlineEntry {
pub title: String,
pub page_index: usize,
pub level: usize,
}
#[derive(Debug, thiserror::Error)]
pub enum DocumentError {
#[error("Failed to open document: {0}")]
Open(String),
#[error("Failed to render page {page_index}: {message}")]
Render { page_index: usize, message: String },
#[error("Page index {0} out of range")]
PageOutOfRange(usize),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}