use anyhow::Result;
use std::path::{Path, PathBuf};
pub(crate) fn user_cache_dir() -> Option<PathBuf> {
if cfg!(target_os = "windows") {
std::env::var_os("LOCALAPPDATA").map(PathBuf::from)
} else {
std::env::var_os("XDG_CACHE_HOME")
.map(PathBuf::from)
.or_else(|| std::env::var_os("HOME").map(|h| Path::new(&h).join(".cache")))
}
}
mod tier1_2;
pub use tier1_2::materialize_into;
pub(crate) use tier1_2::load_resolved_bytes;
#[cfg(test)]
pub(crate) use tier1_2::with_fake_builtins;
pub fn known_names() -> Vec<&'static str> {
let mut all: Vec<&'static str> = tier1_2::known_names();
all.extend(crate::strategies::names());
all.sort();
all.dedup();
all
}
pub fn list_with_manifests() -> Vec<(&'static str, Result<Option<builtin_protocol::Manifest>>)> {
let mut out = Vec::new();
for name in known_names() {
let entry = if crate::strategies::is_embedded_builtin(name) {
crate::strategies::read_manifest(name).map(Some)
} else {
tier1_2::manifest_for(name)
};
out.push((name, entry));
}
out
}
pub fn resolve_manifest(name: &str) -> Result<builtin_protocol::Manifest> {
if crate::strategies::is_embedded_builtin(name) {
crate::strategies::read_manifest(name)
} else {
tier1_2::resolve_manifest(name)
}
}