aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-15 03:16:24 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-15 03:16:24 +0800
commit963c0937abbb985021ccb6319b8734f143c7603f (patch)
treecf44a6e2d04aaa60b3b392c07274f52d6ca91b35
parent0344b9bd05296b879da9688b0abddc4c9c40c9ea (diff)
feat(flag): add PickerFlagAttr enum for parameter attributes
-rw-r--r--mingling_picker/src/flag.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/mingling_picker/src/flag.rs b/mingling_picker/src/flag.rs
index 86712c9..3fa3dc1 100644
--- a/mingling_picker/src/flag.rs
+++ b/mingling_picker/src/flag.rs
@@ -120,3 +120,77 @@ where
self
}
}
+
+/// Describes the attribute (behavior) of a command-line parameter.
+///
+/// This enum specifies how a parameter is parsed and processed:
+///
+/// - `Single`: The parameter accepts a single value. For example, `--name Alice`.
+///
+/// - `Multi`: The parameter accepts multiple values. For example, `--file a.txt --file b.txt`.
+///
+/// - `Flag`: The parameter is a boolean flag with no associated value.
+/// For example, `--verbose` sets a flag to `true`.
+///
+/// - `Positional`: The parameter is matched by its position in the command line,
+/// without requiring a `--name` or `-n` flag. For example, an input filename as the first argument.
+#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+pub enum PickerFlagAttr {
+ /// Accepts multiple values (e.g., `--file a.txt --file b.txt`).
+ Multi,
+
+ /// Accepts a single value (e.g., `--name Alice`).
+ Single,
+
+ /// Boolean flag with no associated value (e.g., `--verbose`).
+ Flag,
+
+ /// Positional argument matched by its position (e.g., an input file).
+ #[default]
+ Positional,
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_picker_flag_attr_ordering() {
+ // Multi > Single > Flag > Positional
+ assert!(PickerFlagAttr::Multi > PickerFlagAttr::Single);
+ assert!(PickerFlagAttr::Multi > PickerFlagAttr::Flag);
+ assert!(PickerFlagAttr::Multi > PickerFlagAttr::Positional);
+
+ assert!(PickerFlagAttr::Single > PickerFlagAttr::Flag);
+ assert!(PickerFlagAttr::Single > PickerFlagAttr::Positional);
+
+ assert!(PickerFlagAttr::Flag > PickerFlagAttr::Positional);
+
+ // PartialOrd
+ assert!(PickerFlagAttr::Multi >= PickerFlagAttr::Single);
+ assert!(PickerFlagAttr::Single >= PickerFlagAttr::Flag);
+ assert!(PickerFlagAttr::Flag >= PickerFlagAttr::Positional);
+
+ assert!(PickerFlagAttr::Positional < PickerFlagAttr::Flag);
+ assert!(PickerFlagAttr::Flag < PickerFlagAttr::Single);
+ assert!(PickerFlagAttr::Single < PickerFlagAttr::Multi);
+
+ // Sort
+ let mut values = vec![
+ PickerFlagAttr::Flag,
+ PickerFlagAttr::Single,
+ PickerFlagAttr::Positional,
+ PickerFlagAttr::Multi,
+ ];
+ values.sort();
+ assert_eq!(
+ values,
+ vec![
+ PickerFlagAttr::Positional,
+ PickerFlagAttr::Flag,
+ PickerFlagAttr::Single,
+ PickerFlagAttr::Multi,
+ ]
+ );
+ }
+}