aboutsummaryrefslogtreecommitdiff
path: root/mingling_picker/src/parselib/flag_matcher.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-17 11:08:07 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-17 11:11:28 +0800
commit79ec6878877f0fd9246d67d3cd4f8cc2d1200150 (patch)
treee3cd8cfc7ef5cd2a6a7ceb93d9a4b1764fa21b61 /mingling_picker/src/parselib/flag_matcher.rs
parente6136f22cff446b16dbebf3b26a6fdea6dbc0e83 (diff)
refactor: rename `mingling_picker` to `arg_picker`
Diffstat (limited to 'mingling_picker/src/parselib/flag_matcher.rs')
-rw-r--r--mingling_picker/src/parselib/flag_matcher.rs82
1 files changed, 0 insertions, 82 deletions
diff --git a/mingling_picker/src/parselib/flag_matcher.rs b/mingling_picker/src/parselib/flag_matcher.rs
deleted file mode 100644
index e93d35a..0000000
--- a/mingling_picker/src/parselib/flag_matcher.rs
+++ /dev/null
@@ -1,82 +0,0 @@
-use crate::{
- matcher_needed::*,
- parselib::{build_possible_flags, get_seeked_first, multi_seek_eq, seek_end_of_options},
-};
-
-/// `FlagMatcher` is used to match flags in command-line arguments.
-///
-/// Flags typically start with `-` or `--` (e.g., `-h`, `--help`),
-/// and do not carry additional values. This matcher is responsible for finding
-/// these flags in the argument list, taking into account that flags after `--`
-/// (end-of-options marker) should not be matched.
-pub struct FlagMatcher;
-
-impl Matcher for FlagMatcher {
- fn on_match_one(
- args: &[MaskedArg],
- style: &ParserStyle,
- arg_info: &PickerArgInfo,
- ) -> Option<usize> {
- let possible_flags = build_possible_flags(style, arg_info);
- let flag_refs: Vec<&str> = possible_flags.iter().map(|s| s.as_str()).collect();
- let end_of_options = seek_end_of_options(args, style);
-
- let result = get_seeked_first(multi_seek_eq(args, &flag_refs, style.case_sensitive));
-
- match (end_of_options, result) {
- (Some(end), Some(current)) if current > end => None,
- _ => result,
- }
- }
-
- fn on_match_all(
- args: &[MaskedArg],
- style: &ParserStyle,
- arg_info: &PickerArgInfo,
- ) -> Vec<usize> {
- let possible_flags = build_possible_flags(style, arg_info);
- single_pass_match_all(args, style, &possible_flags)
- }
-}
-
-/// Single-pass match: finds the `--` marker and matching flags in one iteration.
-fn single_pass_match_all(
- args: &[MaskedArg],
- style: &ParserStyle,
- possible_flags: &[String],
-) -> Vec<usize> {
- let flag_refs: Vec<&str> = possible_flags.iter().map(|s| s.as_str()).collect();
- let eoo = style.end_of_options;
- let case_sensitive = style.case_sensitive;
-
- let mut end_pos: Option<usize> = None;
- let mut matches: Vec<usize> = Vec::new();
-
- for arg in args {
- if end_pos.is_none() {
- let is_eoo = if case_sensitive {
- arg.raw == eoo
- } else {
- arg.raw.eq_ignore_ascii_case(eoo)
- };
- if is_eoo {
- end_pos = Some(arg.raw_idx);
- continue;
- }
- }
-
- // Only match flags before the end-of-options marker.
- if end_pos.is_none() {
- let matched = if case_sensitive {
- flag_refs.contains(&arg.raw)
- } else {
- flag_refs.iter().any(|s| arg.raw.eq_ignore_ascii_case(s))
- };
- if matched {
- matches.push(arg.raw_idx);
- }
- }
- }
-
- matches
-}