pub mod embeddings;
pub mod indexer;
pub mod reranker;
pub mod search;
pub mod setup;
pub const EMBEDDING_DIM: usize = 384;
pub fn model_cache_dir() -> std::path::PathBuf {
if let Ok(dir) = std::env::var("FASTEMBED_CACHE_DIR") {
return std::path::PathBuf::from(dir);
}
if let Ok(xdg) = std::env::var("XDG_CACHE_HOME") {
return std::path::PathBuf::from(xdg).join("cartog").join("models");
}
if let Some(home) = home_dir() {
return home.join(".cache").join("cartog").join("models");
}
std::path::PathBuf::from(".fastembed_cache")
}
fn home_dir() -> Option<std::path::PathBuf> {
std::env::var("HOME")
.or_else(|_| std::env::var("USERPROFILE")) .ok()
.map(std::path::PathBuf::from)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_model_cache_dir_is_not_local() {
let dir = model_cache_dir();
let dir_str = dir.to_string_lossy();
if std::env::var("FASTEMBED_CACHE_DIR").is_err() {
assert!(
dir_str.contains("cartog"),
"cache dir should contain 'cartog', got: {dir_str}"
);
assert!(
!dir_str.starts_with('.'),
"cache dir should be absolute, not relative: {dir_str}"
);
}
}
#[test]
fn test_model_cache_dir_ends_with_models() {
if std::env::var("FASTEMBED_CACHE_DIR").is_err() {
let dir = model_cache_dir();
assert!(
dir.ends_with("models"),
"cache dir should end with 'models', got: {}",
dir.display()
);
}
}
}