mod pdf;
mod csv;
mod text;
mod json;
mod markdown;
pub use pdf::PDFLoader;
pub use csv::CSVLoader;
pub use text::TextLoader;
pub use json::JSONLoader;
pub use markdown::MarkdownLoader;
use crate::vector_stores::Document;
use async_trait::async_trait;
use std::error::Error;
#[derive(Debug)]
pub enum LoaderError {
IoError(std::io::Error),
CsvError(String),
PdfError(String),
JsonError(String),
Other(String),
}
impl std::fmt::Display for LoaderError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LoaderError::IoError(e) => write!(f, "IO 错误: {}", e),
LoaderError::CsvError(msg) => write!(f, "CSV 解析错误: {}", msg),
LoaderError::PdfError(msg) => write!(f, "PDF 解析错误: {}", msg),
LoaderError::JsonError(msg) => write!(f, "JSON 解析错误: {}", msg),
LoaderError::Other(msg) => write!(f, "未知错误: {}", msg),
}
}
}
impl Error for LoaderError {}
impl From<std::io::Error> for LoaderError {
fn from(e: std::io::Error) -> Self {
LoaderError::IoError(e)
}
}
impl From<pdf_extract::Error> for LoaderError {
fn from(err: pdf_extract::Error) -> Self {
LoaderError::PdfError(err.to_string())
}
}
#[async_trait]
pub trait DocumentLoader: Send + Sync {
async fn load(&self) -> Result<Vec<Document>, LoaderError>;
}