use std::sync::LazyLock;
use crate::Result;
#[cfg(feature = "url-ingestion")]
use crate::core::config::UrlExtractionConfig;
use crate::core::config::{ExtractInput, ExtractionConfig, ExtractionResult};
#[cfg(feature = "url-ingestion")]
use crawlberg::{CrawlEngine, MapResult};
static DEFAULT_ENGINE: LazyLock<crate::engine::Engine> = LazyLock::new(crate::engine::Engine::new_default);
pub async fn extract(input: ExtractInput, config: &ExtractionConfig) -> Result<ExtractionResult> {
DEFAULT_ENGINE.extract(input, config).await
}
#[cfg(feature = "redaction")]
#[cfg_attr(feature = "alef-meta", alef(since = "1.3.1"))]
pub async fn extract_with_external_redaction(
input: ExtractInput,
config: &ExtractionConfig,
findings_json: &str,
offset_encoding: Option<&str>,
max_findings: Option<u32>,
) -> Result<ExtractionResult> {
let offset_encoding = offset_encoding.unwrap_or("unicode_code_points").parse()?;
let requested_limit = max_findings.unwrap_or(crate::text::redaction::external::DEFAULT_MAX_FINDINGS);
let default_limits = crate::extractors::security::SecurityLimits::default();
let security_limit = crate::text::redaction::external::security_finding_limit(
config.security_limits.as_ref().unwrap_or(&default_limits),
);
let effective_limit = u32::try_from(security_limit.min(requested_limit as usize)).map_err(|_| {
crate::XbergError::validation("effective redaction finding limit exceeds the supported u32 range".to_string())
})?;
let findings = crate::text::redaction::parse_external_findings_bounded(findings_json, effective_limit)?;
DEFAULT_ENGINE
.extract_with_external_redaction(input, config, findings, offset_encoding, max_findings)
.await
}
pub async fn extract_batch(inputs: Vec<ExtractInput>, config: &ExtractionConfig) -> Result<ExtractionResult> {
DEFAULT_ENGINE.extract_batch(inputs, config).await
}
#[cfg(feature = "url-ingestion")]
pub async fn map_url(uri: &str, config: &UrlExtractionConfig) -> Result<MapResult> {
config.crawl.validate().map_err(map_crawl_err)?;
let engine = CrawlEngine::builder()
.config(config.crawl.clone())
.build()
.map_err(map_crawl_err)?;
engine.map(uri).await.map_err(map_crawl_err)
}
#[cfg(feature = "url-ingestion")]
fn map_crawl_err(error: crawlberg::CrawlError) -> crate::XbergError {
crate::XbergError::validation(format!("crawlberg URL extraction failed: {error}"))
}