#[cfg(feature = "pdf")]
pub mod pdf;
use anyhow::{Context, Result};
use std::io::Read;
pub trait FileReader {
fn read_as_text(&self, file_path: &str) -> Result<String>;
fn read_as_text_from_bytes(&self, _bytes: &[u8]) -> Result<String> {
Err(anyhow::anyhow!(
"Reading from bytes not supported by this file reader"
))
}
#[allow(dead_code)]
fn read_as_text_from_reader(&self, mut reader: Box<dyn Read>) -> Result<String> {
let mut bytes = Vec::new();
reader
.read_to_end(&mut bytes)
.with_context(|| "Failed to read bytes from reader")?;
self.read_as_text_from_bytes(&bytes)
}
#[allow(dead_code)]
fn can_handle(&self, extension: &str) -> bool;
}
pub fn get_reader_for_extension(extension: &str) -> Option<Box<dyn FileReader>> {
match extension.to_lowercase().as_str() {
#[cfg(feature = "pdf")]
"pdf" => Some(Box::new(pdf::PdfReader::new())),
_ => None,
}
}