use oar_ocr_core::core::config::OrtSessionConfig;
use oar_ocr_core::core::traits::OrtConfigurable;
use oar_ocr_core::core::traits::adapter::AdapterBuilder;
use oar_ocr_core::core::{ModelSource, OCRError};
use std::path::{Path, PathBuf};
pub fn resolve_model_path(path: &Path) -> Result<PathBuf, OCRError> {
#[cfg(feature = "auto-download")]
{
oar_ocr_core::core::download::resolve_path(path)
}
#[cfg(not(feature = "auto-download"))]
{
Ok(path.to_path_buf())
}
}
pub fn resolve_model_source(source: &ModelSource) -> Result<ModelSource, OCRError> {
match source {
ModelSource::Path(path) => Ok(ModelSource::Path(resolve_model_path(path)?)),
memory @ ModelSource::Memory(_) => Ok(memory.clone()),
}
}
pub fn build_optional_adapter<B>(
model_source: Option<&ModelSource>,
ort_config: Option<&OrtSessionConfig>,
create_builder: impl FnOnce() -> B,
) -> Result<Option<B::Adapter>, OCRError>
where
B: AdapterBuilder + OrtConfigurable,
{
let Some(source) = model_source else {
return Ok(None);
};
let resolved = resolve_model_source(source)?;
let mut builder = create_builder();
if let Some(config) = ort_config {
builder = builder.with_ort_config(config.clone());
}
Ok(Some(builder.build(resolved)?))
}