Skip to content

Commit 1192002

Browse files
authored
Merge pull request #5721 from epage/update
fix(help): Style arg groups
2 parents e09f793 + 75365ad commit 1192002

File tree

7 files changed

+65
-266
lines changed

7 files changed

+65
-266
lines changed

clap_builder/src/builder/arg.rs

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4329,14 +4329,9 @@ impl Arg {
43294329
let mut styled = StyledStr::new();
43304330
// Write the name such --long or -l
43314331
if let Some(l) = self.get_long() {
4332-
let _ = write!(
4333-
styled,
4334-
"{}--{l}{}",
4335-
literal.render(),
4336-
literal.render_reset()
4337-
);
4332+
let _ = write!(styled, "{literal}--{l}{literal:#}",);
43384333
} else if let Some(s) = self.get_short() {
4339-
let _ = write!(styled, "{}-{s}{}", literal.render(), literal.render_reset());
4334+
let _ = write!(styled, "{literal}-{s}{literal:#}");
43404335
}
43414336
styled.push_styled(&self.stylize_arg_suffix(styles, required));
43424337
styled
@@ -4364,32 +4359,17 @@ impl Arg {
43644359
} else {
43654360
(placeholder, " ")
43664361
};
4367-
let _ = write!(styled, "{}{start}{}", style.render(), style.render_reset());
4362+
let _ = write!(styled, "{style}{start}{style:#}");
43684363
}
43694364
if self.is_takes_value_set() || self.is_positional() {
43704365
let required = required.unwrap_or_else(|| self.is_required_set());
43714366
let arg_val = self.render_arg_val(required);
4372-
let _ = write!(
4373-
styled,
4374-
"{}{arg_val}{}",
4375-
placeholder.render(),
4376-
placeholder.render_reset()
4377-
);
4367+
let _ = write!(styled, "{placeholder}{arg_val}{placeholder:#}",);
43784368
} else if matches!(*self.get_action(), ArgAction::Count) {
4379-
let _ = write!(
4380-
styled,
4381-
"{}...{}",
4382-
placeholder.render(),
4383-
placeholder.render_reset()
4384-
);
4369+
let _ = write!(styled, "{placeholder}...{placeholder:#}",);
43854370
}
43864371
if need_closing_bracket {
4387-
let _ = write!(
4388-
styled,
4389-
"{}]{}",
4390-
placeholder.render(),
4391-
placeholder.render_reset()
4392-
);
4372+
let _ = write!(styled, "{placeholder}]{placeholder:#}",);
43934373
}
43944374

43954375
styled

clap_builder/src/builder/command.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4561,6 +4561,8 @@ impl Command {
45614561
}
45624562

45634563
pub(crate) fn format_group(&self, g: &Id) -> StyledStr {
4564+
use std::fmt::Write as _;
4565+
45644566
let g_string = self
45654567
.unroll_args_in_group(g)
45664568
.iter()
@@ -4576,10 +4578,9 @@ impl Command {
45764578
})
45774579
.collect::<Vec<_>>()
45784580
.join("|");
4581+
let placeholder = self.get_styles().get_placeholder();
45794582
let mut styled = StyledStr::new();
4580-
styled.push_str("<");
4581-
styled.push_string(g_string);
4582-
styled.push_str(">");
4583+
write!(&mut styled, "{placeholder}<{g_string}>{placeholder:#}").unwrap();
45834584
styled
45844585
}
45854586
}

clap_builder/src/error/format.rs

Lines changed: 29 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,7 @@ impl ErrorFormatter for RichFormatter {
108108
styled.push_str("\n");
109109
}
110110
for suggestion in suggestions {
111-
let _ = write!(
112-
styled,
113-
"\n{TAB}{}tip:{} ",
114-
valid.render(),
115-
valid.render_reset()
116-
);
111+
let _ = write!(styled, "\n{TAB}{valid}tip:{valid:#} ",);
117112
styled.push_styled(suggestion);
118113
}
119114
}
@@ -132,7 +127,7 @@ impl ErrorFormatter for RichFormatter {
132127
fn start_error(styled: &mut StyledStr, styles: &Styles) {
133128
use std::fmt::Write as _;
134129
let error = &styles.get_error();
135-
let _ = write!(styled, "{}error:{} ", error.render(), error.render_reset());
130+
let _ = write!(styled, "{error}error:{error:#} ");
136131
}
137132

138133
#[must_use]
@@ -155,26 +150,20 @@ fn write_dynamic_context(
155150
prior_arg = None;
156151
let _ = write!(
157152
styled,
158-
"the argument '{}{invalid_arg}{}' cannot be used multiple times",
159-
invalid.render(),
160-
invalid.render_reset()
153+
"the argument '{invalid}{invalid_arg}{invalid:#}' cannot be used multiple times",
161154
);
162155
} else {
163156
let _ = write!(
164157
styled,
165-
"the argument '{}{invalid_arg}{}' cannot be used with",
166-
invalid.render(),
167-
invalid.render_reset()
158+
"the argument '{invalid}{invalid_arg}{invalid:#}' cannot be used with",
168159
);
169160
}
170161
} else if let Some(ContextValue::String(invalid_arg)) =
171162
error.get(ContextKind::InvalidSubcommand)
172163
{
173164
let _ = write!(
174165
styled,
175-
"the subcommand '{}{invalid_arg}{}' cannot be used with",
176-
invalid.render(),
177-
invalid.render_reset()
166+
"the subcommand '{invalid}{invalid_arg}{invalid:#}' cannot be used with",
178167
);
179168
} else {
180169
styled.push_str(error.kind().as_str().unwrap());
@@ -185,21 +174,11 @@ fn write_dynamic_context(
185174
ContextValue::Strings(values) => {
186175
styled.push_str(":");
187176
for v in values {
188-
let _ = write!(
189-
styled,
190-
"\n{TAB}{}{v}{}",
191-
invalid.render(),
192-
invalid.render_reset()
193-
);
177+
let _ = write!(styled, "\n{TAB}{invalid}{v}{invalid:#}",);
194178
}
195179
}
196180
ContextValue::String(value) => {
197-
let _ = write!(
198-
styled,
199-
" '{}{value}{}'",
200-
invalid.render(),
201-
invalid.render_reset()
202-
);
181+
let _ = write!(styled, " '{invalid}{value}{invalid:#}'",);
203182
}
204183
_ => {
205184
styled.push_str(" one or more of the other specified arguments");
@@ -214,9 +193,7 @@ fn write_dynamic_context(
214193
if let Some(ContextValue::String(invalid_arg)) = invalid_arg {
215194
let _ = write!(
216195
styled,
217-
"equal sign is needed when assigning values to '{}{invalid_arg}{}'",
218-
invalid.render(),
219-
invalid.render_reset()
196+
"equal sign is needed when assigning values to '{invalid}{invalid_arg}{invalid:#}'",
220197
);
221198
true
222199
} else {
@@ -234,18 +211,12 @@ fn write_dynamic_context(
234211
if invalid_value.is_empty() {
235212
let _ = write!(
236213
styled,
237-
"a value is required for '{}{invalid_arg}{}' but none was supplied",
238-
invalid.render(),
239-
invalid.render_reset()
214+
"a value is required for '{invalid}{invalid_arg}{invalid:#}' but none was supplied",
240215
);
241216
} else {
242217
let _ = write!(
243218
styled,
244-
"invalid value '{}{invalid_value}{}' for '{}{invalid_arg}{}'",
245-
invalid.render(),
246-
invalid.render_reset(),
247-
literal.render(),
248-
literal.render_reset()
219+
"invalid value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}'",
249220
);
250221
}
251222

@@ -262,9 +233,7 @@ fn write_dynamic_context(
262233
if let Some(ContextValue::String(invalid_sub)) = invalid_sub {
263234
let _ = write!(
264235
styled,
265-
"unrecognized subcommand '{}{invalid_sub}{}'",
266-
invalid.render(),
267-
invalid.render_reset()
236+
"unrecognized subcommand '{invalid}{invalid_sub}{invalid:#}'",
268237
);
269238
true
270239
} else {
@@ -276,12 +245,7 @@ fn write_dynamic_context(
276245
if let Some(ContextValue::Strings(invalid_arg)) = invalid_arg {
277246
styled.push_str("the following required arguments were not provided:");
278247
for v in invalid_arg {
279-
let _ = write!(
280-
styled,
281-
"\n{TAB}{}{v}{}",
282-
valid.render(),
283-
valid.render_reset()
284-
);
248+
let _ = write!(styled, "\n{TAB}{valid}{v}{valid:#}",);
285249
}
286250
true
287251
} else {
@@ -293,9 +257,7 @@ fn write_dynamic_context(
293257
if let Some(ContextValue::String(invalid_sub)) = invalid_sub {
294258
let _ = write!(
295259
styled,
296-
"'{}{invalid_sub}{}' requires a subcommand but one was not provided",
297-
invalid.render(),
298-
invalid.render_reset()
260+
"'{invalid}{invalid_sub}{invalid:#}' requires a subcommand but one was not provided",
299261
);
300262
let values = error.get(ContextKind::ValidSubcommand);
301263
write_values_list("subcommands", styled, valid, values);
@@ -316,11 +278,7 @@ fn write_dynamic_context(
316278
{
317279
let _ = write!(
318280
styled,
319-
"unexpected value '{}{invalid_value}{}' for '{}{invalid_arg}{}' found; no more were expected",
320-
invalid.render(),
321-
invalid.render_reset(),
322-
literal.render(),
323-
literal.render_reset(),
281+
"unexpected value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}' found; no more were expected",
324282
);
325283
true
326284
} else {
@@ -340,13 +298,7 @@ fn write_dynamic_context(
340298
let were_provided = singular_or_plural(*actual_num_values as usize);
341299
let _ = write!(
342300
styled,
343-
"{}{min_values}{} values required by '{}{invalid_arg}{}'; only {}{actual_num_values}{}{were_provided}",
344-
valid.render(),
345-
valid.render_reset(),
346-
literal.render(),
347-
literal.render_reset(),
348-
invalid.render(),
349-
invalid.render_reset(),
301+
"{valid}{min_values}{valid:#} values required by '{literal}{invalid_arg}{literal:#}'; only {invalid}{actual_num_values}{invalid:#}{were_provided}",
350302
);
351303
true
352304
} else {
@@ -363,11 +315,7 @@ fn write_dynamic_context(
363315
{
364316
let _ = write!(
365317
styled,
366-
"invalid value '{}{invalid_value}{}' for '{}{invalid_arg}{}'",
367-
invalid.render(),
368-
invalid.render_reset(),
369-
literal.render(),
370-
literal.render_reset(),
318+
"invalid value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}'",
371319
);
372320
if let Some(source) = error.inner.source.as_deref() {
373321
let _ = write!(styled, ": {source}");
@@ -390,13 +338,7 @@ fn write_dynamic_context(
390338
let were_provided = singular_or_plural(*actual_num_values as usize);
391339
let _ = write!(
392340
styled,
393-
"{}{num_values}{} values required for '{}{invalid_arg}{}' but {}{actual_num_values}{}{were_provided}",
394-
valid.render(),
395-
valid.render_reset(),
396-
literal.render(),
397-
literal.render_reset(),
398-
invalid.render(),
399-
invalid.render_reset(),
341+
"{valid}{num_values}{valid:#} values required for '{literal}{invalid_arg}{literal:#}' but {invalid}{actual_num_values}{invalid:#}{were_provided}",
400342
);
401343
true
402344
} else {
@@ -408,9 +350,7 @@ fn write_dynamic_context(
408350
if let Some(ContextValue::String(invalid_arg)) = invalid_arg {
409351
let _ = write!(
410352
styled,
411-
"unexpected argument '{}{invalid_arg}{}' found",
412-
invalid.render(),
413-
invalid.render_reset(),
353+
"unexpected argument '{invalid}{invalid_arg}{invalid:#}' found",
414354
);
415355
true
416356
} else {
@@ -437,13 +377,11 @@ fn write_values_list(
437377
if !possible_values.is_empty() {
438378
let _ = write!(styled, "\n{TAB}[{list_name}: ");
439379

440-
let style = valid.render();
441-
let reset = valid.render_reset();
442380
for (idx, val) in possible_values.iter().enumerate() {
443381
if idx > 0 {
444382
styled.push_str(", ");
445383
}
446-
let _ = write!(styled, "{style}{}{reset}", Escape(val));
384+
let _ = write!(styled, "{valid}{}{valid:#}", Escape(val));
447385
}
448386

449387
styled.push_str("]");
@@ -517,48 +455,35 @@ fn try_help(styled: &mut StyledStr, styles: &Styles, help: Option<&str>) {
517455
let literal = &styles.get_literal();
518456
let _ = write!(
519457
styled,
520-
"\n\nFor more information, try '{}{help}{}'.\n",
521-
literal.render(),
522-
literal.render_reset()
458+
"\n\nFor more information, try '{literal}{help}{literal:#}'.\n",
523459
);
524460
} else {
525461
styled.push_str("\n");
526462
}
527463
}
528464

529465
#[cfg(feature = "error-context")]
530-
fn did_you_mean(styled: &mut StyledStr, styles: &Styles, context: &str, valid: &ContextValue) {
466+
fn did_you_mean(styled: &mut StyledStr, styles: &Styles, context: &str, possibles: &ContextValue) {
531467
use std::fmt::Write as _;
532468

533-
let _ = write!(
534-
styled,
535-
"{TAB}{}tip:{}",
536-
styles.get_valid().render(),
537-
styles.get_valid().render_reset()
538-
);
539-
if let ContextValue::String(valid) = valid {
469+
let valid = &styles.get_valid();
470+
let _ = write!(styled, "{TAB}{valid}tip:{valid:#}",);
471+
if let ContextValue::String(possible) = possibles {
540472
let _ = write!(
541473
styled,
542-
" a similar {context} exists: '{}{valid}{}'",
543-
styles.get_valid().render(),
544-
styles.get_valid().render_reset()
474+
" a similar {context} exists: '{valid}{possible}{valid:#}'",
545475
);
546-
} else if let ContextValue::Strings(valid) = valid {
547-
if valid.len() == 1 {
476+
} else if let ContextValue::Strings(possibles) = possibles {
477+
if possibles.len() == 1 {
548478
let _ = write!(styled, " a similar {context} exists: ",);
549479
} else {
550480
let _ = write!(styled, " some similar {context}s exist: ",);
551481
}
552-
for (i, valid) in valid.iter().enumerate() {
482+
for (i, possible) in possibles.iter().enumerate() {
553483
if i != 0 {
554484
styled.push_str(", ");
555485
}
556-
let _ = write!(
557-
styled,
558-
"'{}{valid}{}'",
559-
styles.get_valid().render(),
560-
styles.get_valid().render_reset()
561-
);
486+
let _ = write!(styled, "'{valid}{possible}{valid:#}'",);
562487
}
563488
}
564489
}

0 commit comments

Comments
 (0)