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, args: Option<&str>, ) -> Result, std::io::Error> { match (name.as_str(), args) { ("text", args) => self.text.field(name, args).await, ("meta", None) => 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(), ]) } }