diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 00:07:24 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 16:29:44 +0300 |
| commit | 3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch) | |
| tree | a52280bccc824ca656f8bc986a756f30901974e4 /src/config | |
| parent | 5d7e56737ef30d9de5802b0684a9428c40131dda (diff) | |
feat: add native windows beta support
Diffstat (limited to 'src/config')
| -rw-r--r-- | src/config/io.rs | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/config/io.rs b/src/config/io.rs index 1ea928a3..1bfabf96 100644 --- a/src/config/io.rs +++ b/src/config/io.rs @@ -15,23 +15,71 @@ pub fn app_dir_name() -> &'static str { pub fn config_dir() -> PathBuf { if let Ok(dir) = std::env::var("XDG_CONFIG_HOME") { PathBuf::from(dir).join(app_dir_name()) + } else if cfg!(windows) { + windows_config_dir() } else if let Ok(home) = std::env::var("HOME") { PathBuf::from(home).join(format!(".config/{}", app_dir_name())) } else { - PathBuf::from(format!("/tmp/{}", app_dir_name())) + std::env::temp_dir().join(app_dir_name()) } } pub fn state_dir() -> PathBuf { if let Ok(dir) = std::env::var("XDG_STATE_HOME") { PathBuf::from(dir).join(app_dir_name()) + } else if cfg!(windows) { + windows_state_dir() } else if let Ok(home) = std::env::var("HOME") { PathBuf::from(home).join(format!(".local/state/{}", app_dir_name())) } else { - PathBuf::from(format!("/tmp/{}-state", app_dir_name())) + std::env::temp_dir().join(format!("{}-state", app_dir_name())) } } +#[cfg(windows)] +fn windows_config_dir() -> PathBuf { + if let Ok(dir) = std::env::var("APPDATA") { + return PathBuf::from(dir).join(app_dir_name()); + } + if let Ok(profile) = std::env::var("USERPROFILE") { + return PathBuf::from(profile) + .join("AppData") + .join("Roaming") + .join(app_dir_name()); + } + if let Ok(home) = std::env::var("HOME") { + return PathBuf::from(home).join(format!(".config/{}", app_dir_name())); + } + std::env::temp_dir().join(app_dir_name()) +} + +#[cfg(not(windows))] +fn windows_config_dir() -> PathBuf { + unreachable!("windows_config_dir is only called on Windows") +} + +#[cfg(windows)] +fn windows_state_dir() -> PathBuf { + if let Ok(dir) = std::env::var("LOCALAPPDATA") { + return PathBuf::from(dir).join(app_dir_name()); + } + if let Ok(profile) = std::env::var("USERPROFILE") { + return PathBuf::from(profile) + .join("AppData") + .join("Local") + .join(app_dir_name()); + } + if let Ok(home) = std::env::var("HOME") { + return PathBuf::from(home).join(format!(".local/state/{}", app_dir_name())); + } + std::env::temp_dir().join(format!("{}-state", app_dir_name())) +} + +#[cfg(not(windows))] +fn windows_state_dir() -> PathBuf { + unreachable!("windows_state_dir is only called on Windows") +} + impl Config { pub fn load() -> LoadedConfig { let path = config_path(); |
