Skip to content

Commit 10ca305

Browse files
authored
cap-directories: Support XDG_STATE_HOME (#407)
1 parent 219d0d3 commit 10ca305

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Linux.
5151
[`cap-rand`]: https://github.com/bytecodealliance/cap-std/blob/main/cap-rand/README.md
5252
[`cap-net-ext`]: https://github.com/bytecodealliance/cap-std/blob/main/cap-net-ext/README.md
5353
[`cap_std::fs`]: https://docs.rs/cap-std/latest/cap_std/fs/index.html
54-
[standard application directories]: https://docs.rs/directories-next/
54+
[standard application directories]: https://docs.rs/directories/
5555
[temporary directories]: https://docs.rs/tempfile/
5656
[random number generators]: https://docs.rs/rand/
5757

cap-directories/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ edition = "2021"
1414

1515
[dependencies]
1616
cap-std = { path = "../cap-std", version = "^4.0.0" }
17-
directories-next = "2.0.0"
17+
directories = "6.0.0"
1818

1919
[target.'cfg(not(windows))'.dependencies]
2020
rustix = { version = "1.0.0" }

cap-directories/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
</div>
1414

1515
The `cap-directories` crate provides utilities for accessing standard
16-
directories via the [`directories-next`] crate, but which provide [`Dir`]s instead of
16+
directories via the [`directories`] crate, but which provide [`Dir`]s instead of
1717
`Path`s.
1818

19-
[`directories-next`]: https://crates.io/crates/directories-next
19+
[`directories`]: https://crates.io/crates/directories
2020
[`Dir`]: https://docs.rs/cap-std/latest/cap_std/fs/struct.Dir.html

cap-directories/src/project_dirs.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,24 @@ use std::{fs, io};
77
/// application, which are derived from the standard directories and the name
88
/// of the project/organization.
99
///
10-
/// This corresponds to [`directories_next::ProjectDirs`], except that the
10+
/// This corresponds to [`directories::ProjectDirs`], except that the
1111
/// functions create the directories if they don't exist, open them, and return
1212
/// `Dir`s instead of returning `Path`s.
1313
///
14-
/// Unlike `directories_next::ProjectDirs`, this API has no
14+
/// Unlike `directories::ProjectDirs`, this API has no
1515
/// `ProjectDirs::from_path`, `ProjectDirs::path` or
1616
/// `ProjectDirs::project_path`, and the `*_dir` functions return `Dir`s rather
1717
/// than `Path`s, because absolute paths don't interoperate well with the
1818
/// capability model.
1919
#[derive(Clone)]
2020
pub struct ProjectDirs {
21-
inner: directories_next::ProjectDirs,
21+
inner: directories::ProjectDirs,
2222
}
2323

2424
impl ProjectDirs {
2525
/// Creates a `ProjectDirs` struct from values describing the project.
2626
///
27-
/// This corresponds to [`directories_next::ProjectDirs::from`].
27+
/// This corresponds to [`directories::ProjectDirs::from`].
2828
///
2929
/// # Ambient Authority
3030
///
@@ -37,13 +37,13 @@ impl ProjectDirs {
3737
ambient_authority: AmbientAuthority,
3838
) -> Option<Self> {
3939
let _ = ambient_authority;
40-
let inner = directories_next::ProjectDirs::from(qualifier, organization, application)?;
40+
let inner = directories::ProjectDirs::from(qualifier, organization, application)?;
4141
Some(Self { inner })
4242
}
4343

4444
/// Returns the project's cache directory.
4545
///
46-
/// This corresponds to [`directories_next::ProjectDirs::cache_dir`].
46+
/// This corresponds to [`directories::ProjectDirs::cache_dir`].
4747
pub fn cache_dir(&self) -> io::Result<Dir> {
4848
let path = self.inner.cache_dir();
4949
fs::create_dir_all(path)?;
@@ -52,7 +52,7 @@ impl ProjectDirs {
5252

5353
/// Returns the project's config directory.
5454
///
55-
/// This corresponds to [`directories_next::ProjectDirs::config_dir`].
55+
/// This corresponds to [`directories::ProjectDirs::config_dir`].
5656
pub fn config_dir(&self) -> io::Result<Dir> {
5757
let path = self.inner.config_dir();
5858
fs::create_dir_all(path)?;
@@ -61,7 +61,7 @@ impl ProjectDirs {
6161

6262
/// Returns the project's data directory.
6363
///
64-
/// This corresponds to [`directories_next::ProjectDirs::data_dir`].
64+
/// This corresponds to [`directories::ProjectDirs::data_dir`].
6565
pub fn data_dir(&self) -> io::Result<Dir> {
6666
let path = self.inner.data_dir();
6767
fs::create_dir_all(path)?;
@@ -70,7 +70,7 @@ impl ProjectDirs {
7070

7171
/// Returns the project's local data directory.
7272
///
73-
/// This corresponds to [`directories_next::ProjectDirs::data_local_dir`].
73+
/// This corresponds to [`directories::ProjectDirs::data_local_dir`].
7474
pub fn data_local_dir(&self) -> io::Result<Dir> {
7575
let path = self.inner.data_local_dir();
7676
fs::create_dir_all(path)?;
@@ -79,10 +79,21 @@ impl ProjectDirs {
7979

8080
/// Returns the project's runtime directory.
8181
///
82-
/// This corresponds to [`directories_next::ProjectDirs::runtime_dir`].
82+
/// This corresponds to [`directories::ProjectDirs::runtime_dir`].
8383
pub fn runtime_dir(&self) -> io::Result<Dir> {
8484
let path = self.inner.runtime_dir().ok_or_else(not_found)?;
8585
fs::create_dir_all(path)?;
8686
Dir::open_ambient_dir(path, ambient_authority())
8787
}
88+
89+
/// Returns the project's state directory.
90+
///
91+
/// This corresponds to [`directories::ProjectDirs::state_dir`].
92+
pub fn state_dir(&self) -> io::Result<Option<Dir>> {
93+
let Some(path) = self.inner.state_dir() else {
94+
return Ok(None);
95+
};
96+
fs::create_dir_all(path)?;
97+
Dir::open_ambient_dir(path, ambient_authority()).map(Some)
98+
}
8899
}

cap-directories/src/user_dirs.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,31 @@ use std::io;
66
/// `UserDirs` provides paths of user-facing standard directories, following
77
/// the conventions of the operating system the library is running on.
88
///
9-
/// This corresponds to [`directories_next::UserDirs`], except that the
9+
/// This corresponds to [`directories::UserDirs`], except that the
1010
/// functions open the directories and returns `Dir`s instead of returning
1111
/// `Path`s.
1212
///
13-
/// Unlike `directories_next::UserDirs`, the `*_dir` functions return `Dir`s
13+
/// Unlike `directories::UserDirs`, the `*_dir` functions return `Dir`s
1414
/// rather than `Path`s, because absolute paths don't interoperate well with
1515
/// the capability model.
1616
#[derive(Clone)]
1717
pub struct UserDirs {
18-
inner: directories_next::UserDirs,
18+
inner: directories::UserDirs,
1919
}
2020

2121
impl UserDirs {
2222
/// Creates a `UserDirs` struct which holds the paths to user-facing
2323
/// directories for audio, font, video, etc. data on the system.
2424
///
25-
/// This corresponds to [`directories_next::UserDirs::new`].
25+
/// This corresponds to [`directories::UserDirs::new`].
2626
pub fn new() -> Option<Self> {
27-
let inner = directories_next::UserDirs::new()?;
27+
let inner = directories::UserDirs::new()?;
2828
Some(Self { inner })
2929
}
3030

3131
/// Returns the user's home directory.
3232
///
33-
/// This corresponds to [`directories_next::UserDirs::home_dir`].
33+
/// This corresponds to [`directories::UserDirs::home_dir`].
3434
///
3535
/// # Ambient Authority
3636
///
@@ -42,7 +42,7 @@ impl UserDirs {
4242

4343
/// Returns the user's audio directory.
4444
///
45-
/// This corresponds to [`directories_next::UserDirs::audio_dir`].
45+
/// This corresponds to [`directories::UserDirs::audio_dir`].
4646
///
4747
/// # Ambient Authority
4848
///
@@ -57,7 +57,7 @@ impl UserDirs {
5757

5858
/// Returns the user's desktop directory.
5959
///
60-
/// This corresponds to [`directories_next::UserDirs::desktop_dir`].
60+
/// This corresponds to [`directories::UserDirs::desktop_dir`].
6161
///
6262
/// # Ambient Authority
6363
///
@@ -72,7 +72,7 @@ impl UserDirs {
7272

7373
/// Returns the user's document directory.
7474
///
75-
/// This corresponds to [`directories_next::UserDirs::document_dir`].
75+
/// This corresponds to [`directories::UserDirs::document_dir`].
7676
///
7777
/// # Ambient Authority
7878
///
@@ -87,7 +87,7 @@ impl UserDirs {
8787

8888
/// Returns the user's download directory.
8989
///
90-
/// This corresponds to [`directories_next::UserDirs::download_dir`].
90+
/// This corresponds to [`directories::UserDirs::download_dir`].
9191
///
9292
/// # Ambient Authority
9393
///
@@ -102,7 +102,7 @@ impl UserDirs {
102102

103103
/// Returns the user's font directory.
104104
///
105-
/// This corresponds to [`directories_next::UserDirs::font_dir`].
105+
/// This corresponds to [`directories::UserDirs::font_dir`].
106106
///
107107
/// # Ambient Authority
108108
///
@@ -117,7 +117,7 @@ impl UserDirs {
117117

118118
/// Returns the user's picture directory.
119119
///
120-
/// This corresponds to [`directories_next::UserDirs::picture_dir`].
120+
/// This corresponds to [`directories::UserDirs::picture_dir`].
121121
///
122122
/// # Ambient Authority
123123
///
@@ -132,7 +132,7 @@ impl UserDirs {
132132

133133
/// Returns the user's public directory.
134134
///
135-
/// This corresponds to [`directories_next::UserDirs::public_dir`].
135+
/// This corresponds to [`directories::UserDirs::public_dir`].
136136
///
137137
/// # Ambient Authority
138138
///
@@ -147,7 +147,7 @@ impl UserDirs {
147147

148148
/// Returns the user's template directory.
149149
///
150-
/// This corresponds to [`directories_next::UserDirs::template_dir`].
150+
/// This corresponds to [`directories::UserDirs::template_dir`].
151151
///
152152
/// # Ambient Authority
153153
///
@@ -162,7 +162,7 @@ impl UserDirs {
162162

163163
/// Returns the user's video directory.
164164
///
165-
/// This corresponds to [`directories_next::UserDirs::video_dir`].
165+
/// This corresponds to [`directories::UserDirs::video_dir`].
166166
///
167167
/// # Ambient Authority
168168
///

0 commit comments

Comments
 (0)