1use std::{
2 env,
3 path::{Path, PathBuf},
4};
5
6pub(crate) fn state_db_path() -> PathBuf {
7 if let Some(path) = env::var_os("SAYA_STATE_DB") {
8 return PathBuf::from(path);
9 }
10 let xdg = env::var_os("XDG_DATA_HOME");
11 let appdata = env::var_os("APPDATA");
12 let home = env::var_os("HOME");
13 platform_root(
14 xdg.as_deref().map(Path::new),
15 appdata.as_deref().map(Path::new),
16 home.as_deref().map(Path::new),
17 )
18 .join("saya/state.sqlite3")
19}
20
21pub fn resolve_state_db_path(
22 override_path: Option<&str>,
23 xdg: Option<&str>,
24 appdata: Option<&str>,
25 home: Option<&str>,
26) -> PathBuf {
27 if let Some(path) = override_path {
28 return path.into();
29 }
30 platform_root(
31 xdg.map(Path::new),
32 appdata.map(Path::new),
33 home.map(Path::new),
34 )
35 .join("saya/state.sqlite3")
36}
37
38fn platform_root(xdg: Option<&Path>, appdata: Option<&Path>, home: Option<&Path>) -> PathBuf {
39 if let Some(path) = xdg {
40 return path.into();
41 }
42 if let Some(path) = appdata {
43 return path.into();
44 }
45 let home = home.map(PathBuf::from).unwrap_or_else(env::temp_dir);
46 #[cfg(target_os = "macos")]
47 {
48 home.join("Library/Application Support")
49 }
50 #[cfg(not(target_os = "macos"))]
51 {
52 home.join(".local/share")
53 }
54}