diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-15 03:16:24 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-15 03:16:24 +0800 |
| commit | 963c0937abbb985021ccb6319b8734f143c7603f (patch) | |
| tree | cf44a6e2d04aaa60b3b392c07274f52d6ca91b35 | |
| parent | 0344b9bd05296b879da9688b0abddc4c9c40c9ea (diff) | |
feat(flag): add PickerFlagAttr enum for parameter attributes
| -rw-r--r-- | mingling_picker/src/flag.rs | 74 |
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, + ] + ); + } +} |
