bytecodealliance / bytecodealliance/cap-std

Getting the path of a Dir

Open
#373 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
821
Forks
57
Avg merge
1h 16m
Merged PRs (30d)
4

Description

Sometimes I'd like to be able to get the path for a `Dir`.

For example,

* logs or debugging
* passing the path to a separate process
* passing the path to a library that doesn't yet support the capability model

For example, in a personal project, I'm using the `git2` wrapper around `libgit2`. In order to call `Repository::clone(url, path)`, I need the path of the cache directory. I could use gitoxide, a pure rust implementation of git, however that would have the same problem. Maybe in the future we can make gitoxide use cap-std, but for now that's not an option.

Yes, some of these examples break the capability model, however, from a pragmatic point of view, that may be acceptable.

I'm not sure what the best approach here is, but in my personal project I'm using a wrapper like

```rust
pub struct DirWithPath {
dir: Dir,
path: PathBuf,
}
```

with a constructor like

```rust
pub fn open_ambient_dir>(path: P, ambient_authority: AmbientAuthority) -> io::Result {
Dir::open_ambient_dir(path.as_ref(), ambient_authority).map(|dir| Self {
dir,
path: path.as_ref().to_path_buf(),
})
}
```

and an `open_dir` method that concatenates the path:

```rust
pub fn open_dir>(self: &Self, path: P) -> io::Result {
let full_path = self.path.join(path.as_ref());
self.dir.open_dir(path).map(|dir| Self {
dir,
path: full_path,
})
}
```

One issue with maintaining my own wrapper is that I can't use e.g `ProjectDirs` from `cap-directories` because its methods return `Dir`s, so the paths are unknown. I would have to wrap `directories_next` directly.

I wonder if it would be useful for other people if something like this was added to cap-std (with appropriate warnings with respect to it breaking the capability model)?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.