use std::path::PathBuf;
use crate::config::{Language, OcrConfig};
use crate::error::Result;
use crate::models::download;
use crate::models::registry::{craft_entry, recognizer_entry};
pub trait ModelProvider: Send + Sync {
fn detector(&self) -> Result<PathBuf>;
fn recognizer(&self, language: Language) -> Result<PathBuf>;
}
pub trait ProgressSink: Send + Sync {
fn on_stage(&self, _stage: &str) {}
}
pub(crate) struct NoopProgress;
impl ProgressSink for NoopProgress {}
pub(crate) struct DefaultModelProvider {
cache_dir_override: Option<PathBuf>,
registry_owner: Option<String>,
}
impl DefaultModelProvider {
pub(crate) fn from_config(config: &OcrConfig) -> Result<Self> {
Ok(Self {
cache_dir_override: config.model.cache_dir.clone(),
registry_owner: config.model.registry_owner.clone(),
})
}
}
impl ModelProvider for DefaultModelProvider {
fn detector(&self) -> Result<PathBuf> {
download::ensure(
&craft_entry(),
self.cache_dir_override.as_deref(),
self.registry_owner.as_deref(),
)
}
fn recognizer(&self, language: Language) -> Result<PathBuf> {
download::ensure(
&recognizer_entry(language),
self.cache_dir_override.as_deref(),
self.registry_owner.as_deref(),
)
}
}