Skip to main content

saya_cli/interactive/
session_paths.rs

1use std::{
2    env,
3    path::{Path, PathBuf},
4};
5
6/// Returns the path to the interactive session input history file.
7pub fn default_history_file() -> PathBuf {
8    let session_dir = default_session_dir();
9    match session_dir.parent() {
10        Some(parent) => parent.join("input_history"),
11        None => session_dir.join("input_history"),
12    }
13}
14
15pub fn default_session_dir() -> PathBuf {
16    let override_dir = env::var_os("SAYA_SESSION_DIR").map(PathBuf::from);
17    let xdg = env::var_os("XDG_DATA_HOME").map(PathBuf::from);
18    let appdata = env::var_os("APPDATA").map(PathBuf::from);
19    let home = env::var_os("HOME").map(PathBuf::from);
20    resolve_paths(
21        override_dir.as_deref(),
22        xdg.as_deref(),
23        appdata.as_deref(),
24        home.as_deref(),
25    )
26}
27
28pub fn resolve_session_dir(
29    override_dir: Option<&str>,
30    xdg: Option<&str>,
31    appdata: Option<&str>,
32    home: Option<&str>,
33) -> PathBuf {
34    resolve_paths(
35        override_dir.map(Path::new),
36        xdg.map(Path::new),
37        appdata.map(Path::new),
38        home.map(Path::new),
39    )
40}
41
42fn resolve_paths(
43    override_dir: Option<&Path>,
44    xdg: Option<&Path>,
45    appdata: Option<&Path>,
46    home: Option<&Path>,
47) -> PathBuf {
48    if let Some(path) = override_dir {
49        return path.into();
50    }
51    if let Some(path) = xdg {
52        return path.join("saya/sessions");
53    }
54    if let Some(path) = appdata {
55        return path.join("saya/sessions");
56    }
57    home.map(|path| path.join(".local/share/saya/sessions"))
58        .unwrap_or_else(|| PathBuf::from(".local/share/saya/sessions"))
59}