1use std::env;
2use std::path::PathBuf;
3
4use crate::APP_NAME;
5
6pub enum Os {
7 Windows,
8 Mac,
9 Unix,
10}
11
12impl Os {
13 pub fn get_current() -> Option<Self> {
14 match env::consts::OS {
15 "windows" => Some(Self::Windows),
16 "macos" => Some(Self::Mac),
17 os_str if os_str == "linux" || os_str.contains("bsd") => Some(Self::Unix),
18 _ => None,
19 }
20 }
21
22 pub fn get_config_path(&self) -> Result<PathBuf, std::env::VarError> {
23 let config_home = match self {
24 Os::Windows => PathBuf::from(env::var("APPDATA")?),
25 Os::Mac => {
26 let mut pb = PathBuf::from(env::var("HOME")?);
27 pb.push("Library");
28 pb.push("Application Support");
29 pb
30 }
31 Os::Unix => match env::var("XDG_CONFIG_HOME") {
32 Ok(k) => PathBuf::from(k),
33 Err(_) => {
34 let mut home = PathBuf::from(env::var("HOME")?);
35 home.push(".config");
36 home
37 }
38 },
39 };
40
41 Ok(config_home.join(APP_NAME))
42 }
43}