use pile_config::Label; use std::sync::Arc; mod epub_meta; pub use epub_meta::*; mod epub_text; pub use epub_text::*; use crate::{ extract::traits::ObjectExtractor, value::{Item, PileValue}, }; pub struct EpubExtractor { text: Arc, meta: Arc, } impl EpubExtractor { pub fn new(item: &Item) -> Self { Self { text: Arc::new(EpubTextExtractor::new(item)), meta: Arc::new(EpubMetaExtractor::new(item)), } } } #[async_trait::async_trait] impl ObjectExtractor for EpubExtractor { async fn field(&self, name: &pile_config::Label) -> Result, std::io::Error> { match name.as_str() { "text" => self.text.field(name).await, "meta" => Ok(Some(PileValue::ObjectExtractor(self.meta.clone()))), _ => Ok(None), } } #[expect(clippy::unwrap_used)] async fn fields(&self) -> Result, std::io::Error> { Ok(vec![ Label::new("text").unwrap(), Label::new("meta").unwrap(), ]) } }