pub fn resolve(rel: &str) -> String {
if std::path::Path::new(rel).exists() {
return rel.to_string();
}
if let Some(stripped) = rel.strip_prefix(".models/") {
if let Some(dir) = crate::env::nonempty("DOCLING_RS_MODELS_DIR") {
let p = std::path::Path::new(&dir).join(stripped);
if p.exists() {
return p.to_string_lossy().into_owned();
}
}
}
let dir = std::env::current_exe()
.ok()
.and_then(|p| p.canonicalize().ok())
.and_then(|p| p.parent().map(std::path::Path::to_path_buf));
if let Some(dir) = dir {
for base in [Some(dir.as_path()), dir.parent()].into_iter().flatten() {
let p = base.join(rel);
if p.exists() {
return p.to_string_lossy().into_owned();
}
}
}
rel.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn missing_everywhere_returns_input() {
assert_eq!(
resolve(".models/definitely/not/there.onnx"),
".models/definitely/not/there.onnx"
);
}
#[test]
fn models_dir_override_applies_to_dot_models_paths() {
let dir = std::env::temp_dir().join(format!("docling-assets-{}", std::process::id()));
std::fs::create_dir_all(dir.join("sub")).unwrap();
std::fs::write(dir.join("sub/x.onnx"), b"x").unwrap();
std::env::set_var("DOCLING_RS_MODELS_DIR", &dir);
assert_eq!(
resolve(".models/sub/x.onnx"),
dir.join("sub/x.onnx").to_string_lossy()
);
assert_eq!(resolve(".models/sub/y.onnx"), ".models/sub/y.onnx");
assert_eq!(resolve(".pdfium/lib/nope.so"), ".pdfium/lib/nope.so");
std::env::remove_var("DOCLING_RS_MODELS_DIR");
let _ = std::fs::remove_dir_all(&dir);
}
}