mirror of
https://github.com/sharkdp/fd.git
synced 2024-11-18 01:40:34 +01:00
[ownership] initial struct, parsing, and test framework
This commit is contained in:
parent
daf3046a35
commit
30cb4adc61
2 changed files with 67 additions and 0 deletions
|
@ -1,5 +1,11 @@
|
|||
pub use self::size::SizeFilter;
|
||||
pub use self::time::TimeFilter;
|
||||
|
||||
#[cfg(unix)]
|
||||
pub use self::owner::OwnerFilter;
|
||||
|
||||
mod size;
|
||||
mod time;
|
||||
|
||||
#[cfg(unix)]
|
||||
mod owner;
|
||||
|
|
61
src/filter/owner.rs
Normal file
61
src/filter/owner.rs
Normal file
|
@ -0,0 +1,61 @@
|
|||
use anyhow::{anyhow, Result};
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
pub struct OwnerFilter {
|
||||
uid: Option<u32>,
|
||||
gid: Option<u32>,
|
||||
}
|
||||
|
||||
impl OwnerFilter {
|
||||
pub fn from_string(input: &str) -> Result<Self> {
|
||||
let mut it = input.split(':');
|
||||
let (fst, snd) = (it.next(), it.next());
|
||||
|
||||
let uid = match fst {
|
||||
Some("") | None => None,
|
||||
Some(s) => Some(s.parse()?),
|
||||
};
|
||||
let gid = match snd {
|
||||
Some("") | None => None,
|
||||
Some(s) => Some(s.parse()?),
|
||||
};
|
||||
|
||||
if uid.is_none() && gid.is_none() {
|
||||
Err(anyhow!(
|
||||
"'{}' is not a valid user/group specifier. See 'fd --help'.",
|
||||
input
|
||||
))
|
||||
} else {
|
||||
Ok(OwnerFilter { uid, gid })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod owner_parsing {
|
||||
use super::OwnerFilter;
|
||||
|
||||
macro_rules! owner_tests {
|
||||
($($name:ident: $value:expr => $result:pat,)*) => {
|
||||
$(
|
||||
#[test]
|
||||
fn $name() {
|
||||
let o = OwnerFilter::from_string($value);
|
||||
match o {
|
||||
$result => {},
|
||||
_ => panic!("{:?} does not match {}", o, stringify!($result)),
|
||||
}
|
||||
}
|
||||
)*
|
||||
};
|
||||
}
|
||||
|
||||
owner_tests! {
|
||||
empty: "" => Err(_),
|
||||
uid_only: "5" => Ok(OwnerFilter { uid: Some(5), gid: None }),
|
||||
uid_gid: "9:3" => Ok(OwnerFilter { uid: Some(9), gid: Some(3)}),
|
||||
gid_only: ":8" => Ok(OwnerFilter { uid: None, gid: Some(8)}),
|
||||
colon_only: ":" => Err(_),
|
||||
trailing: "5:" => Ok(OwnerFilter { uid: Some(5), gid: None }),
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue