mod build;
mod validation;
use super::{EntityLinker, ExtractionInput, ExtractionPlan, ExtractionProvider, LinkPolicy};
use crate::{MemoryError, MemoryView, Result};
#[derive(Debug, Clone, Copy, Default)]
pub struct AutoExtractionEngine {
policy: LinkPolicy,
}
impl AutoExtractionEngine {
#[must_use]
pub const fn new(policy: LinkPolicy) -> Self {
Self { policy }
}
pub fn plan<P: ExtractionProvider>(
&self,
provider: &P,
input: &ExtractionInput,
view: &MemoryView,
) -> Result<ExtractionPlan> {
let linker = EntityLinker::from_view(view)?;
self.plan_with_linker(provider, input, &linker)
}
pub fn plan_with_linker<P: ExtractionProvider>(
&self,
provider: &P,
input: &ExtractionInput,
linker: &EntityLinker,
) -> Result<ExtractionPlan> {
input.validate()?;
crate::domain::validate_text("extraction.provider", provider.name())?;
let output = provider.extract(input).map_err(|error| {
if error.provider == provider.name() {
MemoryError::from(error)
} else {
MemoryError::Extraction {
provider: provider.name().to_owned(),
message: "provider error identity does not match provider name".to_owned(),
}
}
})?;
validation::validate_output(&output, input)?;
build::build_plan(self.policy, provider.name(), input, linker, &output)
}
}