parent
87c24ff87d
commit
bd1fa997a7
@ -0,0 +1,82 @@
|
|||||||
|
# Readable Unix Permissions
|
||||||
|
|
||||||
|
Data types for the UNIX file permissions model. Convertable to and from `mode_t`.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Crate is designed to give finer and more sane control over `mode_t`, so there are multiple ways of using the `Permissions` struct.
|
||||||
|
|
||||||
|
All the below functions are `const fn` on nightly.
|
||||||
|
|
||||||
|
### Creating from mode
|
||||||
|
|
||||||
|
``` rust
|
||||||
|
let perms = Permissions::from_mask(0o644); // Any value above 0u777 is truncated.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating through builder-pattern
|
||||||
|
|
||||||
|
You can add masks with `add_mask()`
|
||||||
|
``` rust
|
||||||
|
let perms = Permissions::new()
|
||||||
|
.add_mask(User::Owner, Bit::Read | Bit::Write)
|
||||||
|
.add_mask(User::Group, Bit::Read);
|
||||||
|
```
|
||||||
|
And remove them with `remove_mask()`
|
||||||
|
|
||||||
|
``` rust
|
||||||
|
let perms = Permissions::from_mask(0o777)
|
||||||
|
.remove_mask(User::Other, Bit::Write | Bit::Execute)
|
||||||
|
.remove_mask(User::Group, Bit::Write);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Checking
|
||||||
|
You can check which modes are set with `has_mask()`.
|
||||||
|
|
||||||
|
``` rust
|
||||||
|
let perms = Permissions::from_mask(0o754);
|
||||||
|
assert!(perms.has_mask(User::Owner, Bit::Mask));
|
||||||
|
assert!(perms.has_mask(User::Group, Bit::Read | Bit::Execute));
|
||||||
|
assert!(perms.has_mask(User::Other, Bit::Read));
|
||||||
|
```
|
||||||
|
|
||||||
|
We also derive `PartialEq<u32>`, to compare with `mode_t` directly.
|
||||||
|
|
||||||
|
``` rust
|
||||||
|
let perms = Permissions::from_mask(0o644);
|
||||||
|
|
||||||
|
assert_eq!(perms, 0o644);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Extension trait
|
||||||
|
|
||||||
|
We also define an extension trait on target family `unix` that follows `std::os::unix::fs::PermissionsExt`.
|
||||||
|
See [ext.rs] for details.
|
||||||
|
|
||||||
|
[ext.rs]: ./src/ext.rs
|
||||||
|
|
||||||
|
``` rust
|
||||||
|
use readable_perms::PermissionsExt as UnixPermsExt;
|
||||||
|
use std::os::unix::fs::PermissionsExt;
|
||||||
|
|
||||||
|
fn do_thing(file: &mut std::fs::File)
|
||||||
|
{
|
||||||
|
let perms = file.metadata().unwrap().permissions().unix();
|
||||||
|
println!("Perms are {}", perms);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
On nightly, most functions are `const fn` incuring no runtime cost for constant definitions. On stable, not so. Either way, we define a global `const` lookup table, so that conversions are as fast as a memory lookup.
|
||||||
|
|
||||||
|
Adding and removing the masks is usually 1 or two bitwise operations. TODO: Benchmark these?
|
||||||
|
|
||||||
|
### Benchmarks
|
||||||
|
|
||||||
|
| Type | Value |
|
||||||
|
|-----------------------|----------------------|
|
||||||
|
| Conversions from mode | 159 ns/iter (+/- 15) |
|
||||||
|
| Conversions to mode | 162 ns/iter (+/- 15) |
|
||||||
|
|
||||||
|
# License
|
||||||
|
GPL'd with <3
|
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue