pitchfork_cli/
env.rs

1use once_cell::sync::Lazy;
2pub use std::env::*;
3use std::path::PathBuf;
4
5pub static PITCHFORK_BIN: Lazy<PathBuf> = Lazy::new(|| {
6    current_exe()
7        .and_then(|p| p.canonicalize())
8        .unwrap_or_else(|e| {
9            eprintln!("Warning: Could not determine pitchfork binary path: {e}");
10            args()
11                .next()
12                .map(PathBuf::from)
13                .unwrap_or_else(|| PathBuf::from("pitchfork"))
14        })
15});
16pub static CWD: Lazy<PathBuf> = Lazy::new(|| current_dir().unwrap_or_else(|_| PathBuf::from(".")));
17
18pub static HOME_DIR: Lazy<PathBuf> = Lazy::new(|| {
19    dirs::home_dir().unwrap_or_else(|| {
20        eprintln!("Warning: Could not determine home directory");
21        PathBuf::from("/tmp")
22    })
23});
24pub static PITCHFORK_CONFIG_DIR: Lazy<PathBuf> = Lazy::new(|| {
25    var_path("PITCHFORK_CONFIG_DIR").unwrap_or(HOME_DIR.join(".config").join("pitchfork"))
26});
27pub static PITCHFORK_GLOBAL_CONFIG_USER: Lazy<PathBuf> =
28    Lazy::new(|| PITCHFORK_CONFIG_DIR.join("config.toml"));
29pub static PITCHFORK_GLOBAL_CONFIG_SYSTEM: Lazy<PathBuf> =
30    Lazy::new(|| PathBuf::from("/etc/pitchfork/config.toml"));
31pub static PITCHFORK_STATE_DIR: Lazy<PathBuf> = Lazy::new(|| {
32    var_path("PITCHFORK_STATE_DIR").unwrap_or(
33        dirs::state_dir()
34            .unwrap_or(HOME_DIR.join(".local").join("state"))
35            .join("pitchfork"),
36    )
37});
38pub static PITCHFORK_STATE_FILE: Lazy<PathBuf> =
39    Lazy::new(|| PITCHFORK_STATE_DIR.join("state.toml"));
40pub static PITCHFORK_LOG: Lazy<log::LevelFilter> =
41    Lazy::new(|| var_log_level("PITCHFORK_LOG").unwrap_or(log::LevelFilter::Info));
42pub static PITCHFORK_LOG_FILE_LEVEL: Lazy<log::LevelFilter> =
43    Lazy::new(|| var_log_level("PITCHFORK_LOG_FILE_LEVEL").unwrap_or(*PITCHFORK_LOG));
44pub static PITCHFORK_LOGS_DIR: Lazy<PathBuf> =
45    Lazy::new(|| var_path("PITCHFORK_LOGS_DIR").unwrap_or(PITCHFORK_STATE_DIR.join("logs")));
46pub static PITCHFORK_LOG_FILE: Lazy<PathBuf> =
47    Lazy::new(|| PITCHFORK_LOGS_DIR.join("pitchfork").join("pitchfork.log"));
48// pub static PITCHFORK_EXEC: Lazy<bool> = Lazy::new(|| var_true("PITCHFORK_EXEC"));
49
50pub static IPC_SOCK_DIR: Lazy<PathBuf> = Lazy::new(|| PITCHFORK_STATE_DIR.join("sock"));
51pub static IPC_SOCK_MAIN: Lazy<PathBuf> = Lazy::new(|| IPC_SOCK_DIR.join("main.sock"));
52
53// Capture the PATH at startup so daemons can find user tools
54pub static ORIGINAL_PATH: Lazy<Option<String>> = Lazy::new(|| var("PATH").ok());
55pub static IPC_JSON: Lazy<bool> = Lazy::new(|| !var_false("IPC_JSON"));
56
57// Delay in seconds before autostopping daemons when leaving a directory
58// Set to 0 to disable the delay (stop immediately)
59pub static PITCHFORK_AUTOSTOP_DELAY: Lazy<u64> =
60    Lazy::new(|| var_u64("PITCHFORK_AUTOSTOP_DELAY").unwrap_or(60));
61
62// Interval in seconds for the supervisor's background watcher
63// Default: 10 seconds. Lower values useful for testing.
64pub static PITCHFORK_INTERVAL_SECS: Lazy<u64> =
65    Lazy::new(|| var_u64("PITCHFORK_INTERVAL_SECS").unwrap_or(10));
66
67fn var_path(name: &str) -> Option<PathBuf> {
68    var(name).map(PathBuf::from).ok()
69}
70
71fn var_u64(name: &str) -> Option<u64> {
72    var(name).ok().and_then(|val| val.parse().ok())
73}
74
75fn var_log_level(name: &str) -> Option<log::LevelFilter> {
76    var(name).ok().and_then(|level| level.parse().ok())
77}
78
79fn var_false(name: &str) -> bool {
80    var(name)
81        .map(|val| val.to_lowercase())
82        .map(|val| val == "false" || val == "0")
83        .unwrap_or(false)
84}
85
86// fn var_true(name: &str) -> bool {
87//     var(name)
88//         .map(|val| val.to_lowercase())
89//         .map(|val| val == "true" || val == "1")
90//         .unwrap_or(false)
91// }