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"));
27pub 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
32pub 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