|
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