| 439 | } |
| 440 | |
| 441 | fn short_cluster_value( |
| 442 | root: &clap::Command, |
| 443 | key: &str, |
| 444 | argv: &[OsString], |
| 445 | index: usize, |
| 446 | spellings: &[String], |
| 447 | ) -> Option<Option<OsString>> { |
| 448 | let token = argv[index].to_str()?; |
| 449 | let cluster = token.strip_prefix('-')?; |
| 450 | if cluster.is_empty() || cluster.starts_with('-') { |
| 451 | return None; |
| 452 | } |
| 453 | |
| 454 | let target = spellings.iter().filter_map(|spelling| { |
| 455 | let short = spelling.strip_prefix('-')?; |
| 456 | let mut chars = short.chars(); |
| 457 | let value = chars.next()?; |
| 458 | chars.next().is_none().then_some(value) |
| 459 | }); |
| 460 | let target = target.collect::<Vec<_>>(); |
| 461 | let node = walk_to(root, key); |
| 462 | |
| 463 | for (offset, short) in cluster.char_indices() { |
| 464 | let arg = node |
| 465 | .get_arguments() |
| 466 | .chain(root.get_arguments()) |
| 467 | .find(|arg| { |
| 468 | arg.get_short() == Some(short) |
| 469 | || arg |
| 470 | .get_all_short_aliases() |
| 471 | .is_some_and(|aliases| aliases.contains(&short)) |
| 472 | })?; |
| 473 | let suffix = &cluster[offset + short.len_utf8()..]; |
| 474 | if target.contains(&short) { |
| 475 | return Some(match suffix.strip_prefix('=') { |
| 476 | Some(value) => Some(OsString::from(value)), |
| 477 | None if suffix.is_empty() => argv.get(index + 1).cloned(), |
| 478 | None => Some(OsString::from(suffix)), |
| 479 | }); |
| 480 | } |
| 481 | if arg.get_action().takes_values() { |
| 482 | return None; |
| 483 | } |
| 484 | } |
| 485 | None |
| 486 | } |
| 487 | |
| 488 | fn raw_option_value( |
| 489 | root: &clap::Command, |