aboutsummaryrefslogtreecommitdiff
path: root/src/config
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 00:07:24 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 16:29:44 +0300
commit3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch)
treea52280bccc824ca656f8bc986a756f30901974e4 /src/config
parent5d7e56737ef30d9de5802b0684a9428c40131dda (diff)
feat: add native windows beta support
Diffstat (limited to 'src/config')
-rw-r--r--src/config/io.rs52
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();