#[derive(Default)]
pub struct PathCheckRule {
pub exist_check: Option<PathExistCheck>,
pub type_check: Option<PathTypeCheck>,
}
pub enum PathExistCheck {
Exists,
NotExists,
}
pub struct PathTypeCheck {
pub allow_file: bool,
pub allow_dir: bool,
pub allow_symlink: bool,
}
impl PathCheckRule {
pub fn new() -> Self {
Self {
exist_check: None,
type_check: None,
}
}
pub fn allow_file(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: true,
allow_dir: type_check.allow_dir,
allow_symlink: type_check.allow_symlink,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: true,
allow_dir: false,
allow_symlink: false,
}),
..self
},
}
}
pub fn allow_dir(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: type_check.allow_file,
allow_dir: true,
allow_symlink: type_check.allow_symlink,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: true,
allow_symlink: false,
}),
..self
},
}
}
pub fn allow_symlink(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: type_check.allow_file,
allow_dir: type_check.allow_dir,
allow_symlink: true,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: false,
allow_symlink: true,
}),
..self
},
}
}
pub fn deny_file(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: type_check.allow_dir,
allow_symlink: type_check.allow_symlink,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: true,
allow_symlink: true,
}),
..self
},
}
}
pub fn deny_dir(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: type_check.allow_file,
allow_dir: false,
allow_symlink: type_check.allow_symlink,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: true,
allow_dir: false,
allow_symlink: true,
}),
..self
},
}
}
pub fn deny_symlink(self) -> Self {
match self.type_check {
Some(type_check) => Self {
type_check: Some(PathTypeCheck {
allow_file: type_check.allow_file,
allow_dir: type_check.allow_dir,
allow_symlink: false,
}),
..self
},
None => Self {
type_check: Some(PathTypeCheck {
allow_file: true,
allow_dir: true,
allow_symlink: false,
}),
..self
},
}
}
pub fn must_file(self) -> Self {
Self {
type_check: Some(PathTypeCheck {
allow_file: true,
allow_dir: false,
allow_symlink: false,
}),
..self
}
}
pub fn must_dir(self) -> Self {
Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: true,
allow_symlink: false,
}),
..self
}
}
pub fn must_symlink(self) -> Self {
Self {
type_check: Some(PathTypeCheck {
allow_file: false,
allow_dir: false,
allow_symlink: true,
}),
..self
}
}
pub fn must_exist(self) -> Self {
Self {
exist_check: Some(PathExistCheck::Exists),
..self
}
}
pub fn must_not_exist(self) -> Self {
Self {
exist_check: Some(PathExistCheck::NotExists),
..self
}
}
}