Skip to content

Commit f8fb8f4

Browse files
committed
Switch from directories to etcetera
The directories crate doesn't use XDG on macOS, which is apparently the preferred way for CLI apps to store configuration. See: dirs-dev/directories-rs#47 dirs-dev/directories-rs#62
1 parent 2751c2c commit f8fb8f4

File tree

4 files changed

+47
-72
lines changed

4 files changed

+47
-72
lines changed

Cargo.lock

+22-60
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cli/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ yaml = ["dep:serde_yaml"]
2323
anyhow = "1.0.72"
2424
clap = { version = "4.3.21", features = ["derive", "env"] }
2525
clap_complete = "4.3.2"
26-
directories = "5.0.1"
26+
etcetera = "0.8.0"
2727
facti-api = { version = "0.1.0", path = "../api", default-features = false, features = [
2828
"blocking"
2929
] }

crates/cli/src/dirs.rs

+23-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
11
use std::path::PathBuf;
22

33
use anyhow::{Context, Result};
4-
use directories::ProjectDirs;
4+
use etcetera::{choose_app_strategy, AppStrategy, AppStrategyArgs};
55

66
const APP_QUALIFIER: &str = "com";
77
const APP_ORG: &str = "Sharparam";
88
const APP_NAME: &str = "facti";
99

10+
macro_rules! strategy {
11+
() => {
12+
choose_app_strategy(AppStrategyArgs {
13+
top_level_domain: APP_QUALIFIER.to_owned(),
14+
author: APP_ORG.to_owned(),
15+
app_name: APP_NAME.to_owned(),
16+
})
17+
.context("Failed to create app strategy")
18+
};
19+
}
20+
1021
pub fn config() -> Result<PathBuf> {
11-
let proj_dirs = ProjectDirs::from(APP_QUALIFIER, APP_ORG, APP_NAME)
12-
.context("Failed to resolve project dirs")?;
13-
let path = proj_dirs.config_dir();
14-
Ok(path.to_owned())
22+
Ok(strategy!()?.config_dir())
23+
}
24+
25+
pub fn data() -> Result<PathBuf> {
26+
Ok(strategy!()?.data_dir())
1527
}
1628

17-
pub fn data_local() -> Result<PathBuf> {
18-
Ok(ProjectDirs::from(APP_QUALIFIER, APP_ORG, APP_NAME)
19-
.context("Failed to resolve project dirs")?
20-
.data_local_dir()
21-
.to_owned())
29+
pub fn state() -> Result<PathBuf> {
30+
let strategy = strategy!()?;
31+
match strategy.state_dir() {
32+
Some(path) => Ok(path),
33+
None => Ok(strategy.data_dir()),
34+
}
2235
}

crates/cli/src/logging.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn init<T: Into<LogLevelFilter>>(filter: T) -> anyhow::Result<LogGuard> {
3939
let level_filter = tracing_subscriber::filter::LevelFilter::from(log_level);
4040
let file_level_filter = tracing_subscriber::filter::LevelFilter::from(file_log_level);
4141

42-
let logs_dir = dirs::data_local()?.join("logs");
42+
let logs_dir = dirs::state()?.join("logs");
4343
let file_appender = tracing_appender::rolling::daily(&logs_dir, "facti.log");
4444
let (file_appender, file_guard) = tracing_appender::non_blocking(file_appender);
4545
let json_appender = tracing_appender::rolling::daily(&logs_dir, "facti.json.log");

0 commit comments

Comments
 (0)