aboutsummaryrefslogtreecommitdiff
path: root/mingling/src/parser/picker/path/rule.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-05-21 19:22:27 +0800
committer魏曹先生 <1992414357@qq.com>2026-05-21 19:22:27 +0800
commit2213d332782764ab19e20c867bafa75a8aab0b65 (patch)
treed696cb0256addadf93f543f711e878ed70644027 /mingling/src/parser/picker/path/rule.rs
parentc2edd02745b5bdfcb8a6bb1da64e411e77855cac (diff)
Add path picker and PathChecker for CLI argument validation
Diffstat (limited to 'mingling/src/parser/picker/path/rule.rs')
-rw-r--r--mingling/src/parser/picker/path/rule.rs218
1 files changed, 218 insertions, 0 deletions
diff --git a/mingling/src/parser/picker/path/rule.rs b/mingling/src/parser/picker/path/rule.rs
new file mode 100644
index 0000000..07df705
--- /dev/null
+++ b/mingling/src/parser/picker/path/rule.rs
@@ -0,0 +1,218 @@
+/// Path check rule
+#[derive(Default)]
+pub struct PathCheckRule {
+ pub exist_check: Option<PathExistCheck>,
+ pub type_check: Option<PathTypeCheck>,
+}
+
+/// Path existence check
+pub enum PathExistCheck {
+ Exists,
+ NotExists,
+}
+
+/// Path type check
+pub struct PathTypeCheck {
+ /// Whether the path is allowed to be a file
+ pub allow_file: bool,
+
+ /// Whether the path is allowed to be a directory
+ pub allow_dir: bool,
+
+ /// Whether the path is allowed to be a symlink
+ pub allow_symlink: bool,
+}
+
+impl PathCheckRule {
+ /// Creates a new `PathCheckRule` with default values
+ pub fn new() -> Self {
+ Self {
+ exist_check: None,
+ type_check: None,
+ }
+ }
+
+ /// Allows the path to be a file
+ 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
+ },
+ }
+ }
+
+ /// Allows the path to be a directory
+ 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
+ },
+ }
+ }
+
+ /// Allows the path to be a symlink
+ 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
+ },
+ }
+ }
+
+ /// Denies the path from being a file
+ 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
+ },
+ }
+ }
+
+ /// Denies the path from being a directory
+ 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
+ },
+ }
+ }
+
+ /// Denies the path from being a symlink
+ 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
+ },
+ }
+ }
+
+ /// Requires the path to be a file (overrides type checks)
+ pub fn must_file(self) -> Self {
+ Self {
+ type_check: Some(PathTypeCheck {
+ allow_file: true,
+ allow_dir: false,
+ allow_symlink: false,
+ }),
+ ..self
+ }
+ }
+
+ /// Requires the path to be a directory (overrides type checks)
+ pub fn must_dir(self) -> Self {
+ Self {
+ type_check: Some(PathTypeCheck {
+ allow_file: false,
+ allow_dir: true,
+ allow_symlink: false,
+ }),
+ ..self
+ }
+ }
+
+ /// Requires the path to be a symlink (overrides type checks)
+ pub fn must_symlink(self) -> Self {
+ Self {
+ type_check: Some(PathTypeCheck {
+ allow_file: false,
+ allow_dir: false,
+ allow_symlink: true,
+ }),
+ ..self
+ }
+ }
+
+ /// Requires the path to exist
+ pub fn must_exist(self) -> Self {
+ Self {
+ exist_check: Some(PathExistCheck::Exists),
+ ..self
+ }
+ }
+
+ /// Requires the path to not exist
+ pub fn must_not_exist(self) -> Self {
+ Self {
+ exist_check: Some(PathExistCheck::NotExists),
+ ..self
+ }
+ }
+}