Repository: clap-rs/clap (language: rust)

Issue:
Wrong `Did you mean` suggestion: for `alignmentScorr` clap suggests `alignmentStart` rather than `alignmentScore`
### Please complete the following tasks

- [X] I have searched the [discussions](https://github.com/clap-rs/clap/discussions)
- [X] I have searched the [open](https://github.com/clap-rs/clap/issues) and [rejected](https://github.com/clap-rs/clap/issues?q=is%3Aissue+label%3AS-wont-fix+is%3Aclosed) issues

### Rust Version

rustc 1.66.0 (69f9c33d7 2022-12-12)

### Clap Version

clap 3.1.18

### Minimal reproducible code

Will try to extract a minimal reproducible example later

```rust
fn main() {}
```

Bug discovered here: https://github.com/nextstrain/nextclade/commit/8facbb49ab4cd64a4087679bed12742b9f014f8c

### Steps to reproduce the bug with the above code

cargo run --bin nextclade run -d sars-cov-2 test.fa  -C alignmentScorr -t out.tsv

### Actual Behaviour

```
❯ cargo run --bin nextclade run -d sars-cov-2 test.fa  -C alignmentScorr -t out.tsv
    Finished dev [unoptimized + debuginfo] target(s) in 0.57s
     Running `target/debug/nextclade run -d sars-cov-2 test.fa -C alignmentScorr -t out.tsv`
error: "alignmentScorr" isn't a valid value for '--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...'
        [possible values: all, general, ref-muts, priv-muts, errs-warns, qc, primers, dynamic, clade, qc.overallScore, qc.overallStatus, totalSubstitutions, totalDeletions, totalInsertions, totalFrameShifts, totalMissing, totalNonACGTNs, totalAminoacidSubstitutions, totalAminoacidDeletions, totalAminoacidInsertions, alignmentScore, alignmentStart, alignmentEnd, coverage, isReverseComplement, substitutions, deletions, insertions, frameShifts, aaSubstitutions, aaDeletions, aaInsertions, privateNucMutations.reversionSubstitutions, privateNucMutations.labeledSubstitutions, privateNucMutations.unlabeledSubstitutions, privateNucMutations.totalReversionSubstitutions, privateNucMutations.totalLabeledSubstitutions, privateNucMutations.totalUnlabeledSubstitutions, privateNucMutations.totalPrivateSubstitutions, missing, nonACGTNs, qc.overallScore, qc.overallStatus, qc.missingData.missingDataThreshold, qc.missingData.score, qc.missingData.status, qc.missingData.totalMissing, qc.mixedSites.mixedSitesThreshold, qc.mixedSites.score, qc.mixedSites.status, qc.mixedSites.totalMixedSites, qc.privateMutations.cutoff, qc.privateMutations.excess, qc.privateMutations.score, qc.privateMutations.status, qc.privateMutations.total, qc.snpClusters.clusteredSNPs, qc.snpClusters.score, qc.snpClusters.status, qc.snpClusters.totalSNPs, qc.frameShifts.frameShifts, qc.frameShifts.totalFrameShifts, qc.frameShifts.frameShiftsIgnored, qc.frameShifts.totalFrameShiftsIgnored, qc.frameShifts.score, qc.frameShifts.status, qc.stopCodons.stopCodons, qc.stopCodons.totalStopCodons, qc.stopCodons.score, qc.stopCodons.status, totalPcrPrimerChanges, pcrPrimerChanges, failedGenes, warnings, errors]

        Did you mean "alignmentStart"?
```

### Expected Behaviour

Same as above except for:

```
        Did you mean "alignmentScore"?
```

`alignmentScore` is much much closer by any string metric to `alignmentScorr` than `alignmentStart` -> clear bug

### Additional Context

I looked at the code how the `did you mean` is implemented and noticed that the tests don't seem to run due to type: `features` instead of `feature`: https://github.com/clap-rs/clap/blob/e8518cf07d0fadc712986da7427bc2d294e5cfa1/src/suggestions.rs#L86

### Debug Output

<details>
  <summary>Click to unfold</summary>


```
[        clap::build::command]  Command::_do_parse
[        clap::build::command]  Command::_build: name="nextclade"
[        clap::build::command]  Command::_propagate:nextclade
[        clap::build::command]  Command::_check_help_and_version: nextclade
[        clap::build::command]  Command::_check_help_and_version: Building help subcommand
[        clap::build::command]  Command::_propagate_global_args:nextclade
[        clap::build::command]  Command::_derive_display_order:nextclade
[        clap::build::command]  Command::_derive_display_order:completions
[        clap::build::command]  Command::_derive_display_order:run
[        clap::build::command]  Command::_derive_display_order:dataset
[        clap::build::command]  Command::_derive_display_order:list
[        clap::build::command]  Command::_derive_display_order:get
[        clap::build::command]  Command::_derive_display_order:help
[  clap::build::debug_asserts]  Command::_debug_asserts
[  clap::build::debug_asserts]  Arg::_debug_asserts:help
[  clap::build::debug_asserts]  Arg::_debug_asserts:version
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbosity
[  clap::build::debug_asserts]  Arg::_debug_asserts:silent
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbose
[  clap::build::debug_asserts]  Arg::_debug_asserts:quiet
[  clap::build::debug_asserts]  Command::_verify_positionals
[         clap::parse::parser]  Parser::get_matches_with
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("run")' ([114, 117, 110])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("run")
[         clap::parse::parser]  Parser::get_matches_with: sc=Some("run")
[         clap::parse::parser]  Parser::parse_subcommand
[         clap::output::usage]  Usage::get_required_usage_from: incls=[], matcher=false, incl_last=true
[         clap::output::usage]  Usage::get_required_usage_from: unrolled_reqs={}
[         clap::output::usage]  Usage::get_required_usage_from: ret_val={}
[        clap::build::command]  Command::_build_subcommand Setting bin_name of run to "nextclade run"
[        clap::build::command]  Command::_build_subcommand Setting display_name of run to "nextclade-run"
[        clap::build::command]  Command::_build: name="run"
[        clap::build::command]  Command::_propagate:run
[        clap::build::command]  Command::_check_help_and_version: run
[        clap::build::command]  Command::_check_help_and_version: Removing generated version
[        clap::build::command]  Command::_propagate_global_args:run
[        clap::build::command]  Command::_derive_display_order:run
[  clap::build::debug_asserts]  Command::_debug_asserts
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-fastas
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-fasta
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-dataset
[  clap::build::debug_asserts]  Arg::_debug_asserts:dataset-name
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-ref
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-tree
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-qc-config
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-virus-properties
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-pcr-primers
[  clap::build::debug_asserts]  Arg::_debug_asserts:input-gene-map
[  clap::build::debug_asserts]  Arg::_debug_asserts:genes
[  clap::build::debug_asserts]  Arg::_debug_asserts:server
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-dir
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-all
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-basename
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-selection
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-fasta
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-translations
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-ndjson
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-json
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-csv
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-tsv
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-columns-selection
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-tree
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-insertions
[  clap::build::debug_asserts]  Arg::_debug_asserts:output-errors
[  clap::build::debug_asserts]  Arg::_debug_asserts:include-reference
[  clap::build::debug_asserts]  Arg::_debug_asserts:in-order
[  clap::build::debug_asserts]  Arg::_debug_asserts:replace-unknown
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-length
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-extend
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open-in-frame
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-gap-open-out-of-frame
[  clap::build::debug_asserts]  Arg::_debug_asserts:penalty-mismatch
[  clap::build::debug_asserts]  Arg::_debug_asserts:score-match
[  clap::build::debug_asserts]  Arg::_debug_asserts:max-indel
[  clap::build::debug_asserts]  Arg::_debug_asserts:seed-length
[  clap::build::debug_asserts]  Arg::_debug_asserts:mismatches-allowed
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-seeds
[  clap::build::debug_asserts]  Arg::_debug_asserts:min-match-rate
[  clap::build::debug_asserts]  Arg::_debug_asserts:seed-spacing
[  clap::build::debug_asserts]  Arg::_debug_asserts:retry-reverse-complement
[  clap::build::debug_asserts]  Arg::_debug_asserts:no-translate-past-stop
[  clap::build::debug_asserts]  Arg::_debug_asserts:excess-bandwidth
[  clap::build::debug_asserts]  Arg::_debug_asserts:terminal-bandwidth
[  clap::build::debug_asserts]  Arg::_debug_asserts:gap-alignment-side
[  clap::build::debug_asserts]  Arg::_debug_asserts:jobs
[  clap::build::debug_asserts]  Arg::_debug_asserts:help
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbosity
[  clap::build::debug_asserts]  Arg::_debug_asserts:silent
[  clap::build::debug_asserts]  Arg::_debug_asserts:verbose
[  clap::build::debug_asserts]  Arg::_debug_asserts:quiet
[  clap::build::debug_asserts]  Command::_verify_positionals
[         clap::parse::parser]  Parser::parse_subcommand: About to parse sc=run
[         clap::parse::parser]  Parser::get_matches_with
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-d")' ([45, 100])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("-d")
[         clap::parse::parser]  Parser::get_matches_with: sc=None
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("d"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['d']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:d
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: cur_idx:=1
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:d: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("d"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=dataset-name, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(TAKES_VAL)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=dataset-name
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(dataset-name)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("sars-cov-2")' ([115, 97, 114, 115, 45, 99, 111, 118, 45, 50])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=dataset-name, val=RawOsStr("sars-cov-2")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."sars-cov-2"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=2
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=dataset-name
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("test.fa")' ([116, 101, 115, 116, 46, 102, 97])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::possible_subcommand: arg=Ok("test.fa")
[         clap::parse::parser]  Parser::get_matches_with: sc=None
[         clap::parse::parser]  Parser::remove_overrides: id=input-fastas
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=input-fastas
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[         clap::parse::parser]  Parser::add_val_to_arg; arg=input-fastas, val=RawOsStr("test.fa")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."test.fa"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=3
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=input-fastas
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-C")' ([45, 67])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("C"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['C']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:C
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: cur_idx:=4
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:C: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("C"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=output-columns-selection, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(MULTIPLE_OCC | TAKES_VAL | USE_DELIM | MULTIPLE_VALS | MULTIPLE)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=output-columns-selection
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=output-columns-selection
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(output-columns-selection)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("alignmentScorr")' ([97, 108, 105, 103, 110, 109, 101, 110, 116, 83, 99, 111, 114, 114])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=output-columns-selection, val=RawOsStr("alignmentScorr")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."alignmentScorr"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=5
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=output-columns-selection
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("-t")' ([45, 116])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::parse_short_arg: short_arg=ShortFlags { inner: RawOsStr("t"), utf8_prefix: CharIndices { front_offset: 0, iter: Chars(['t']) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_short_arg:iter:t
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: cur_idx:=6
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: Found valid opt or flag
[         clap::parse::parser]  Parser::parse_short_arg:iter:t: val=RawOsStr("") (bytes), val=[] (ascii), short_arg=ShortFlags { inner: RawOsStr("t"), utf8_prefix: CharIndices { front_offset: 1, iter: Chars([]) }, invalid_suffix: None }
[         clap::parse::parser]  Parser::parse_opt; opt=output-tsv, val=None, has_eq=false
[         clap::parse::parser]  Parser::parse_opt; opt.settings=ArgFlags(TAKES_VAL)
[         clap::parse::parser]  Parser::parse_opt; Checking for val...
[         clap::parse::parser]  Parser::parse_opt: More arg vals required...
[         clap::parse::parser]  Parser::remove_overrides: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_arg: id=output-tsv
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::inc_occurrence_of_group: id=tabular_output
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[         clap::parse::parser]  Parser::get_matches_with: After parse_short_arg Opt(output-tsv)
[         clap::parse::parser]  Parser::get_matches_with: Begin parsing 'RawOsStr("out.tsv")' ([111, 117, 116, 46, 116, 115, 118])
[         clap::parse::parser]  Parser::get_matches_with: Positional counter...1
[         clap::parse::parser]  Parser::get_matches_with: Low index multiples...false
[         clap::parse::parser]  Parser::add_val_to_arg; arg=output-tsv, val=RawOsStr("out.tsv")
[         clap::parse::parser]  Parser::add_val_to_arg; trailing_values=false, DontDelimTrailingVals=false
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."out.tsv"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=7
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[    clap::parse::arg_matcher]  ArgMatcher::needs_more_vals: o=output-tsv
[         clap::parse::parser]  Parser::add_defaults
[         clap::parse::parser]  Parser::add_defaults:iter:input-fasta:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-fasta: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-fasta: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-dataset:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-dataset: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-dataset: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:dataset-name:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:dataset-name: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:dataset-name: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-ref:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-ref: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-ref: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-tree:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-tree: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-tree: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-qc-config:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-qc-config: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-qc-config: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-virus-properties:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-virus-properties: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-virus-properties: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-pcr-primers:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-pcr-primers: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-pcr-primers: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-gene-map:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-gene-map: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-gene-map: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:genes:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:genes: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:genes: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:server:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:server: has default vals
[         clap::parse::parser]  Parser::add_value:iter:server: wasn't used
[        clap::build::command]  Command::groups_for_arg: id=server
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."https://data.master.clades.nextstrain.org/"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=8
[        clap::build::command]  Command::groups_for_arg: id=server
[         clap::parse::parser]  Parser::add_value:iter:server: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-dir:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-dir: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-dir: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-all:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-all: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-all: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-basename:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-basename: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-basename: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-selection:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-selection: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-selection: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-fasta:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-fasta: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-fasta: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-translations:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-translations: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-translations: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-ndjson:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-ndjson: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-ndjson: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-json:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-json: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-json: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-csv:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-csv: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-csv: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-tsv:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-tsv: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-tsv: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-columns-selection:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-columns-selection: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-columns-selection: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-tree:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-tree: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-tree: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-insertions:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-insertions: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-insertions: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:output-errors:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:output-errors: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:output-errors: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-length:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-length: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-length: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-extend:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-extend: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-extend: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open-in-frame:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-in-frame: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-in-frame: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-gap-open-out-of-frame:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-out-of-frame: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-gap-open-out-of-frame: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:penalty-mismatch:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:penalty-mismatch: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:penalty-mismatch: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:score-match:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:score-match: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:score-match: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:max-indel:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:max-indel: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:max-indel: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:seed-length:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:seed-length: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:seed-length: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:mismatches-allowed:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:mismatches-allowed: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:mismatches-allowed: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-seeds:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-seeds: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-seeds: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:min-match-rate:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:min-match-rate: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:min-match-rate: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:seed-spacing:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:seed-spacing: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:seed-spacing: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:retry-reverse-complement:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: has default missing vals
[         clap::parse::parser]  Parser::add_value:iter:retry-reverse-complement: wasn't used
[         clap::parse::parser]  Parser::add_defaults:iter:no-translate-past-stop:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: has default missing vals
[         clap::parse::parser]  Parser::add_value:iter:no-translate-past-stop: wasn't used
[         clap::parse::parser]  Parser::add_defaults:iter:excess-bandwidth:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:excess-bandwidth: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:excess-bandwidth: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:terminal-bandwidth:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:terminal-bandwidth: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:terminal-bandwidth: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:gap-alignment-side:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:gap-alignment-side: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:gap-alignment-side: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:jobs:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:jobs: has default vals
[         clap::parse::parser]  Parser::add_value:iter:jobs: wasn't used
[        clap::build::command]  Command::groups_for_arg: id=jobs
[         clap::parse::parser]  Parser::add_single_val_to_arg: adding val..."10"
[         clap::parse::parser]  Parser::add_single_val_to_arg: cur_idx:=9
[        clap::build::command]  Command::groups_for_arg: id=jobs
[         clap::parse::parser]  Parser::add_value:iter:jobs: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:verbosity:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:verbosity: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:verbosity: doesn't have default missing vals
[         clap::parse::parser]  Parser::add_defaults:iter:input-fastas:
[         clap::parse::parser]  Parser::add_value: doesn't have conditional defaults
[         clap::parse::parser]  Parser::add_value:iter:input-fastas: doesn't have default vals
[         clap::parse::parser]  Parser::add_value:iter:input-fastas: doesn't have default missing vals
[      clap::parse::validator]  Validator::validate
[      clap::parse::validator]  Validator::validate_conflicts
[      clap::parse::validator]  Validator::validate_exclusive
[      clap::parse::validator]  Validator::validate_exclusive:iter:dataset-name
[      clap::parse::validator]  Validator::validate_exclusive:iter:input-fastas
[      clap::parse::validator]  Validator::validate_exclusive:iter:output-columns-selection
[      clap::parse::validator]  Validator::validate_exclusive:iter:output-tsv
[      clap::parse::validator]  Validator::validate_exclusive:iter:tabular_output
[      clap::parse::validator]  Validator::validate_exclusive:iter:server
[      clap::parse::validator]  Validator::validate_exclusive:iter:jobs
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=dataset-name
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=dataset-name
[        clap::build::command]  Command::groups_for_arg: id=dataset-name
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=dataset-name, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=input-fastas
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=input-fastas, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=output-columns-selection, conflicts=[]
[        clap::build::command]  Command::groups_for_arg: id=output-tsv
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=output-tsv, conflicts=[output-all, output-csv]
[      clap::parse::validator]  Conflicts::gather_direct_conflicts id=tabular_output, conflicts=[]
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=input-fastas
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=input-fastas
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=output-columns-selection
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_conflicts::iter: id=output-tsv
[      clap::parse::validator]  Conflicts::gather_conflicts: arg=output-tsv
[      clap::parse::validator]  Conflicts::gather_conflicts: conflicts=[]
[      clap::parse::validator]  Validator::validate_required: required=ChildGraph([])
[      clap::parse::validator]  Validator::gather_requires
[      clap::parse::validator]  Validator::gather_requires:iter:dataset-name
[      clap::parse::validator]  Validator::gather_requires:iter:input-fastas
[      clap::parse::validator]  Validator::gather_requires:iter:output-columns-selection
[      clap::parse::validator]  Validator::gather_requires:iter:output-tsv
[      clap::parse::validator]  Validator::gather_requires:iter:tabular_output
[      clap::parse::validator]  Validator::gather_requires:iter:tabular_output:group
[      clap::parse::validator]  Validator::validate_required: is_exclusive_present=false
[      clap::parse::validator]  Validator::validate_required_unless
[      clap::parse::validator]  Validator::validate_matched_args
[      clap::parse::validator]  Validator::validate_matched_args:iter:dataset-name: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "sars-cov-2",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="dataset-name"
[      clap::parse::validator]  Validator::validate_arg_values: checking validator...
[      clap::parse::validator]  good
[      clap::parse::validator]  Validator::validate_arg_num_occurs: "dataset-name"=1
[      clap::parse::validator]  Validator::validate_matched_args:iter:input-fastas: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "test.fa",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="input-fastas"
[      clap::parse::validator]  Validator::validate_arg_values: checking validator...
[      clap::parse::validator]  good
[      clap::parse::validator]  Validator::validate_arg_num_occurs: "input-fastas"=1
[      clap::parse::validator]  Validator::validate_matched_args:iter:output-columns-selection: vals=Flatten {
    inner: FlattenCompat {
        iter: Fuse {
            iter: Some(
                Iter(
                    [
                        [
                            "alignmentScorr",
                        ],
                    ],
                ),
            ),
        },
        frontiter: None,
        backiter: None,
    },
}
[      clap::parse::validator]  Validator::validate_arg_num_vals
[      clap::parse::validator]  Validator::validate_arg_values: arg="output-columns-selection"
[      clap::parse::validator]  Validator::validate_arg_values: possible_vals=[PossibleValue { name: "all", help: None, aliases: [], hide: false }, PossibleValue { name: "general", help: None, aliases: [], hide: false }, PossibleValue { name: "ref-muts", help: None, aliases: [], hide: false }, PossibleValue { name: "priv-muts", help: None, aliases: [], hide: false }, PossibleValue { name: "errs-warns", help: None, aliases: [], hide: false }, PossibleValue { name: "qc", help: None, aliases: [], hide: false }, PossibleValue { name: "primers", help: None, aliases: [], hide: false }, PossibleValue { name: "dynamic", help: None, aliases: [], hide: false }, PossibleValue { name: "clade", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallScore", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallStatus", help: None, aliases: [], hide: false }, PossibleValue { name: "totalSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalFrameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "totalMissing", help: None, aliases: [], hide: false }, PossibleValue { name: "totalNonACGTNs", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "totalAminoacidInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentScore", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentStart", help: None, aliases: [], hide: false }, PossibleValue { name: "alignmentEnd", help: None, aliases: [], hide: false }, PossibleValue { name: "coverage", help: None, aliases: [], hide: false }, PossibleValue { name: "isReverseComplement", help: None, aliases: [], hide: false }, PossibleValue { name: "substitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "deletions", help: None, aliases: [], hide: false }, PossibleValue { name: "insertions", help: None, aliases: [], hide: false }, PossibleValue { name: "frameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "aaSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "aaDeletions", help: None, aliases: [], hide: false }, PossibleValue { name: "aaInsertions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.reversionSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.labeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.unlabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalReversionSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalLabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalUnlabeledSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "privateNucMutations.totalPrivateSubstitutions", help: None, aliases: [], hide: false }, PossibleValue { name: "missing", help: None, aliases: [], hide: false }, PossibleValue { name: "nonACGTNs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallScore", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.overallStatus", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.missingDataThreshold", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.missingData.totalMissing", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.mixedSitesThreshold", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.mixedSites.totalMixedSites", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.cutoff", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.excess", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.privateMutations.total", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.clusteredSNPs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.snpClusters.totalSNPs", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.frameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.totalFrameShifts", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.frameShiftsIgnored", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.totalFrameShiftsIgnored", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.frameShifts.status", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.stopCodons", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.totalStopCodons", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.score", help: None, aliases: [], hide: false }, PossibleValue { name: "qc.stopCodons.status", help: None, aliases: [], hide: false }, PossibleValue { name: "totalPcrPrimerChanges", help: None, aliases: [], hide: false }, PossibleValue { name: "pcrPrimerChanges", help: None, aliases: [], hide: false }, PossibleValue { name: "failedGenes", help: None, aliases: [], hide: false }, PossibleValue { name: "warnings", help: None, aliases: [], hide: false }, PossibleValue { name: "errors", help: None, aliases: [], hide: false }]
[         clap::output::usage]  Usage::create_usage_with_title
[         clap::output::usage]  Usage::create_usage_no_title
[         clap::output::usage]  Usage::create_smart_usage
[         clap::output::usage]  Usage::get_required_usage_from: incls=[dataset-name, input-fastas, output-columns-selection, output-tsv, tabular_output], matcher=false, incl_last=true
[         clap::output::usage]  Usage::get_required_usage_from: unrolled_reqs={tabular_output}
[        clap::build::command]  Command::unroll_args_in_group: group=tabular_output
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-all
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-csv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-tsv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[         clap::output::usage]  Usage::get_required_usage_from:iter:dataset-name
[         clap::output::usage]  Usage::get_required_usage_from:iter:output-columns-selection
[        clap::build::command]  Command::unroll_args_in_group: group=tabular_output
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-all
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-csv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[        clap::build::command]  Command::unroll_args_in_group:iter: entity=output-tsv
[        clap::build::command]  Command::unroll_args_in_group:iter: this is an arg
[         clap::output::usage]  Usage::get_required_usage_from:push:input-fastas
[         clap::output::usage]  Usage::get_required_usage_from: ret_val={"--dataset-name <DATASET_NAME>", "--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...", "<--output-all <OUTPUT_ALL>|--output-csv <OUTPUT_CSV>|--output-tsv <OUTPUT_TSV>>", "<INPUT_FASTAS>..."}
[        clap::build::command]  Command::color: Color setting...
[        clap::build::command]  Auto
error: "alignmentScorr" isn't a valid value for '--output-columns-selection <OUTPUT_COLUMNS_SELECTION>...'
        [possible values: all, general, ref-muts, priv-muts, errs-warns, qc, primers, dynamic, clade, qc.overallScore, qc.overallStatus, totalSubstitutions, totalDeletions, totalInsertions, totalFrameShifts, totalMissing, totalNonACGTNs, totalAminoacidSubstitutions, totalAminoacidDeletions, totalAminoacidInsertions, alignmentScore, alignmentStart, alignmentEnd, coverage, isReverseComplement, substitutions, deletions, insertions, frameShifts, aaSubstitutions, aaDeletions, aaInsertions, privateNucMutations.reversionSubstitutions, privateNucMutations.labeledSubstitutions, privateNucMutations.unlabeledSubstitutions, privateNucMutations.totalReversionSubstitutions, privateNucMutations.totalLabeledSubstitutions, privateNucMutations.totalUnlabeledSubstitutions, privateNucMutations.totalPrivateSubstitutions, missing, nonACGTNs, qc.overallScore, qc.overallStatus, qc.missingData.missingDataThreshold, qc.missingData.score, qc.missingData.status, qc.missingData.totalMissing, qc.mixedSites.mixedSitesThreshold, qc.mixedSites.score, qc.mixedSites.status, qc.mixedSites.totalMixedSites, qc.privateMutations.cutoff, qc.privateMutations.excess, qc.privateMutations.score, qc.privateMutations.status, qc.privateMutations.total, qc.snpClusters.clusteredSNPs, qc.snpClusters.score, qc.snpClusters.status, qc.snpClusters.totalSNPs, qc.frameShifts.frameShifts, qc.frameShifts.totalFrameShifts, qc.frameShifts.frameShiftsIgnored, qc.frameShifts.totalFrameShiftsIgnored, qc.frameShifts.score, qc.frameShifts.status, qc.stopCodons.stopCodons, qc.stopCodons.totalStopCodons, qc.stopCodons.score, qc.stopCodons.status, totalPcrPrimerChanges, pcrPrimerChanges, failedGenes, warnings, errors]

        Did you mean "alignmentStart"?

USAGE:
    nextclade run --dataset-name <DATASET_NAME> --output-columns-selection <OUTPUT_COLUMNS_SELECTION>... <--output-all <OUTPUT_ALL>|--output-csv <OUTPUT_CSV>|--output-tsv <OUTPUT_TSV>> <INPUT_FASTAS>...

For more information try --help
  
  ```
</details>



Discussion / hints:
I looked into this as part of #4664.  The problem is [jaro_winkler](https://docs.rs/strsim/latest/strsim/fn.jaro_winkler.html) is returning the same score for both strings (1.0) and so the last declared value is being preferred
Interesting, thanks! I'll check whether that's a bug in the `jaro_winkler` implementation - feels like it is to me.

It looks like https://github.com/dguo/strsim-rs is no longer maintained, and potentially has other bugs. I'll verify that this is indeed a bug. So one either needs to fork and fix, or switch to a different crate.

For other bugs in Jaro-Winkler: https://github.com/dguo/strsim-rs/issues/49

It turns out that the implementation of Jaro-Winkler in strsim-rs is very unconventional to wrong, see https://github.com/dguo/strsim-rs/issues/53, I dug in a bit and indeed, if the strings have common prefixes >=10 the similarity is 1, which isn't really what we want I think.

One immediate workaround would be to use just the normal Jaro instead, from the same crate. The Winkler modification is useful for things like making sure `Billy` and `Bill` are more similar than `Willy` and `Billy`. But since clap doesn't match names but options which don't necessarily have the important things at the beginning (typos can be anywhere) I don't see why Jaro-Winkler is necessarily the better metric to use.

In either case, the current use of the false/buggy `Jaro-Winkler` implementation means that clap's `did_you_mean` does not provide as helpful suggestions as it could if it used a proper implementation or Jaro instead. 



Fix patch:
diff --git a/src/parser/features/suggestions.rs b/src/parser/features/suggestions.rs
index b64fcce3971..b8bb7adfa15 100644
--- a/src/parser/features/suggestions.rs
+++ b/src/parser/features/suggestions.rs
@@ -4,10 +4,9 @@ use std::cmp::Ordering;
 // Internal
 use crate::builder::Command;
 
-/// Produces multiple strings from a given list of possible values which are similar
-/// to the passed in value `v` within a certain confidence by least confidence.
-/// Thus in a list of possible values like ["foo", "bar"], the value "fop" will yield
-/// `Some("foo")`, whereas "blark" would yield `None`.
+/// Find strings from an iterable of `possible_values` similar to a given value `v`
+/// Returns a Vec of all possible values that exceed a similarity threshold
+/// sorted by ascending similarity, most similar comes last
 #[cfg(feature = "suggestions")]
 pub(crate) fn did_you_mean<T, I>(v: &str, possible_values: I) -> Vec<String>
 where
@@ -16,8 +15,11 @@ where
 {
     let mut candidates: Vec<(f64, String)> = possible_values
         .into_iter()
-        .map(|pv| (strsim::jaro_winkler(v, pv.as_ref()), pv.as_ref().to_owned()))
-        .filter(|(confidence, _)| *confidence > 0.8)
+        // GH #4660: using `jaro` because `jaro_winkler` implementation in `strsim-rs` is wrong
+        // causing strings with common prefix >=10 to be considered perfectly similar
+        .map(|pv| (strsim::jaro(v, pv.as_ref()), pv.as_ref().to_owned()))
+        // Confidence of 0.7 so that bar -> baz is suggested
+        .filter(|(confidence, _)| *confidence > 0.7)
         .collect();
     candidates.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap_or(Ordering::Equal));
     candidates.into_iter().map(|(_, pv)| pv).collect()
@@ -112,6 +114,15 @@ mod test {
         );
     }
 
+    #[test]
+    fn best_fit_long_common_prefix_issue_4660() {
+        let p_vals = ["alignmentScore", "alignmentStart"];
+        assert_eq!(
+            did_you_mean("alignmentScorr", p_vals.iter()),
+            vec!["alignmentStart", "alignmentScore"]
+        );
+    }
+
     #[test]
     fn flag_missing_letter() {
         let p_vals = ["test", "possible", "values"];


Test patch: