use anyhow::Result; use std::path::Path; use crate::model::Document; // Shared reader logic for CBx (CBZ/CBR) formats pub trait CbxReader: Send + Sync { // Implementors should return a list of (file_name, jpeg_bytes) fn extract_images(&self, input: &Path) -> Result)>>; // Build a Document from extracted JPEG bytes fn read_cbx(&self, input: &Path) -> Result { let files = self.extract_images(input)?; let mut pages: Vec = Vec::new(); { use rayon::prelude::*; files .par_iter() .map(|(name, data)| crate::model::ImagePage { name: name.clone(), image: image::load_from_memory(data).expect("Failed to decode image"), jpeg_dct: Some(data.clone()), }) .collect_into_vec(&mut pages); pages.par_sort_by_key(|p| p.name.clone()); } Ok(Document::new(pages)) } }