pitchfork_cli/
env.rs

1use once_cell::sync::Lazy;
2pub use std::env::*;
3use std::path::PathBuf;
4
5pub static PITCHFORK_BIN: Lazy<PathBuf> =
6    Lazy::new(|| current_exe().unwrap().canonicalize().unwrap());
7pub static CWD: Lazy<PathBuf> = Lazy::new(|| current_dir().unwrap_or_default());
8
9pub static HOME_DIR: Lazy<PathBuf> = Lazy::new(|| dirs::home_dir().unwrap_or_default());
10pub static PITCHFORK_STATE_DIR: Lazy<PathBuf> = Lazy::new(|| {
11    var_path("PITCHFORK_STATE_DIR").unwrap_or(
12        dirs::state_dir()
13            .unwrap_or(HOME_DIR.join(".local").join("state"))
14            .join("pitchfork"),
15    )
16});
17pub static PITCHFORK_STATE_FILE: Lazy<PathBuf> =
18    Lazy::new(|| PITCHFORK_STATE_DIR.join("state.toml"));
19pub static PITCHFORK_LOG: Lazy<log::LevelFilter> =
20    Lazy::new(|| var_log_level("PITCHFORK_LOG").unwrap_or(log::LevelFilter::Info));
21pub static PITCHFORK_LOG_FILE_LEVEL: Lazy<log::LevelFilter> =
22    Lazy::new(|| var_log_level("PITCHFORK_LOG_FILE_LEVEL").unwrap_or(*PITCHFORK_LOG));
23pub static PITCHFORK_LOGS_DIR: Lazy<PathBuf> =
24    Lazy::new(|| var_path("PITCHFORK_LOGS_DIR").unwrap_or(PITCHFORK_STATE_DIR.join("logs")));
25pub static PITCHFORK_LOG_FILE: Lazy<PathBuf> =
26    Lazy::new(|| PITCHFORK_LOGS_DIR.join("pitchfork").join("pitchfork.log"));
27// pub static PITCHFORK_EXEC: Lazy<bool> = Lazy::new(|| var_true("PITCHFORK_EXEC"));
28
29pub static IPC_SOCK_DIR: Lazy<PathBuf> = Lazy::new(|| PITCHFORK_STATE_DIR.join("sock"));
30pub static IPC_SOCK_MAIN: Lazy<PathBuf> = Lazy::new(|| IPC_SOCK_DIR.join("main.sock"));
31
32// Capture the PATH at startup so daemons can find user tools
33pub static ORIGINAL_PATH: Lazy<Option<String>> = Lazy::new(|| var("PATH").ok());
34pub static IPC_JSON: Lazy<bool> = Lazy::new(|| !var_false("IPC_JSON"));
35
36fn var_path(name: &str) -> Option<PathBuf> {
37    var(name).map(PathBuf::from).ok()
38}
39
40fn var_log_level(name: &str) -> Option<log::LevelFilter> {
41    var(name).ok().and_then(|level| level.parse().ok())
42}
43
44fn var_false(name: &str) -> bool {
45    var(name)
46        .map(|val| val.to_lowercase())
47        .map(|val| val == "false" || val == "0")
48        .unwrap_or(false)
49}
50
51// fn var_true(name: &str) -> bool {
52//     var(name)
53//         .map(|val| val.to_lowercase())
54//         .map(|val| val == "true" || val == "1")
55//         .unwrap_or(false)
56// }