|
1 | 1 | use clap::{Arg, ArgAction};
|
2 | 2 | use roff::{bold, italic, roman, Inline, Roff};
|
3 | 3 |
|
| 4 | +pub(crate) fn option_sort_key(arg: &Arg) -> (usize, String) { |
| 5 | + let key = if let Some(x) = arg.get_short() { |
| 6 | + let mut s = x.to_ascii_lowercase().to_string(); |
| 7 | + s.push(if x.is_ascii_lowercase() { '0' } else { '1' }); |
| 8 | + s |
| 9 | + } else if let Some(x) = arg.get_long() { |
| 10 | + x.to_string() |
| 11 | + } else { |
| 12 | + let mut s = '{'.to_string(); |
| 13 | + s.push_str(arg.get_id().as_str()); |
| 14 | + s |
| 15 | + }; |
| 16 | + (arg.get_display_order(), key) |
| 17 | +} |
| 18 | + |
| 19 | +/// Provides consistent sorting for subcommands |
| 20 | +pub(crate) fn subcmd_sort_key(subcmd: &clap::Command) -> (usize, &str) { |
| 21 | + (subcmd.get_display_order(), subcmd.get_name()) |
| 22 | +} |
| 23 | + |
4 | 24 | pub(crate) fn subcommand_heading(cmd: &clap::Command) -> &str {
|
5 | 25 | match cmd.get_subcommand_help_heading() {
|
6 | 26 | Some(title) => title,
|
@@ -35,7 +55,7 @@ pub(crate) fn synopsis(roff: &mut Roff, cmd: &clap::Command) {
|
35 | 55 |
|
36 | 56 | let mut opts: Vec<_> = cmd.get_arguments().filter(|i| !i.is_hide_set()).collect();
|
37 | 57 |
|
38 |
| - opts.sort_by_key(|opt| opt.get_display_order()); |
| 58 | + opts.sort_by_key(|opt| option_sort_key(opt)); |
39 | 59 |
|
40 | 60 | for opt in opts {
|
41 | 61 | let (lhs, rhs) = option_markers(opt);
|
@@ -94,7 +114,7 @@ pub(crate) fn synopsis(roff: &mut Roff, cmd: &clap::Command) {
|
94 | 114 |
|
95 | 115 | pub(crate) fn options(roff: &mut Roff, items: &[&Arg]) {
|
96 | 116 | let mut sorted_items = items.to_vec();
|
97 |
| - sorted_items.sort_by_key(|opt| opt.get_display_order()); |
| 117 | + sorted_items.sort_by_key(|opt| option_sort_key(opt)); |
98 | 118 |
|
99 | 119 | for opt in sorted_items.iter().filter(|a| !a.is_positional()) {
|
100 | 120 | let mut header = match (opt.get_short(), opt.get_long()) {
|
@@ -138,7 +158,7 @@ pub(crate) fn options(roff: &mut Roff, items: &[&Arg]) {
|
138 | 158 | }
|
139 | 159 | }
|
140 | 160 |
|
141 |
| - for pos in sorted_items.iter().filter(|a| a.is_positional()) { |
| 161 | + for pos in items.iter().filter(|a| a.is_positional()) { |
142 | 162 | let mut header = vec![];
|
143 | 163 | let (lhs, rhs) = option_markers(pos);
|
144 | 164 | header.push(roman(lhs));
|
@@ -206,7 +226,10 @@ fn possible_options(roff: &mut Roff, arg: &Arg, arg_help_written: bool) {
|
206 | 226 | }
|
207 | 227 |
|
208 | 228 | pub(crate) fn subcommands(roff: &mut Roff, cmd: &clap::Command, section: &str) {
|
209 |
| - for sub in cmd.get_subcommands().filter(|s| !s.is_hide_set()) { |
| 229 | + let mut sorted_subcommands: Vec<_> = |
| 230 | + cmd.get_subcommands().filter(|s| !s.is_hide_set()).collect(); |
| 231 | + sorted_subcommands.sort_by_key(|sub| subcmd_sort_key(sub)); |
| 232 | + for sub in sorted_subcommands { |
210 | 233 | roff.control("TP", []);
|
211 | 234 |
|
212 | 235 | let name = format!(
|
|
0 commit comments