Skip to main content

declint_core/
store.rs

1//! The global ruleset store: where `declint install -g` vendors
2//! packages, and where `import: global:<pkg>` finds them.
3
4use std::path::PathBuf;
5
6/// The global store directory, or `None` when no home can be determined.
7///
8/// `$DECLINT_HOME` overrides the root (store lives at `$DECLINT_HOME/store`);
9/// otherwise the store is `$HOME/.declint/store`.
10pub fn global_store_dir() -> Option<PathBuf> {
11    if let Ok(root) = std::env::var("DECLINT_HOME") {
12        if !root.is_empty() {
13            return Some(PathBuf::from(root).join("store"));
14        }
15    }
16    let home = std::env::var("HOME").ok()?;
17    if home.is_empty() {
18        return None;
19    }
20    Some(PathBuf::from(home).join(".declint").join("store"))
21}
22
23/// Resolves a `global:<pkg>` reference to its entry config file.
24///
25/// `pkg` is `<owner>/<repo>` as printed by `declint install -g`; a bare
26/// repo name is accepted too (resolved directly under the store). The
27/// entry file is `declint.yaml`.
28pub fn lookup_global(pkg: &str) -> Option<PathBuf> {
29    let store = global_store_dir()?;
30    let sanitized = pkg.replace(['\\', ':'], "-");
31    let entry = store.join(&sanitized).join("declint.yaml");
32    if entry.is_file() {
33        Some(entry)
34    } else {
35        None
36    }
37}