Skip to content

Commit e025858

Browse files
committed
Merge pull request #14 from dylan-foundry/help-vs-positional-args
Allow -h to work with invalid positional args.
2 parents 67e305d + 8dec0e7 commit e025858

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

command-line-parser.dylan

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -614,9 +614,9 @@ define method parse-command-line
614614
add-option(parser, parser.help-option);
615615
end;
616616
block ()
617-
%parse-command-line(parser, argv);
617+
%parse-command-line(parser, argv, usage, description);
618618
exception (ex :: <usage-error>)
619-
if (do-help?)
619+
if (do-help? & ~instance?(ex, <help-requested>))
620620
format(*standard-error*,
621621
"Error: %s\nUse %s to see command-line options.\n",
622622
ex,
@@ -631,15 +631,11 @@ define method parse-command-line
631631
end;
632632
signal(ex)
633633
end;
634-
if (do-help? & parser.help-option.option-value)
635-
print-synopsis(parser, *standard-output*,
636-
usage: usage, description: description);
637-
error(make(<help-requested>));
638-
end;
639634
end method parse-command-line;
640635

641636
define function %parse-command-line
642-
(parser :: <command-line-parser>, argv :: <sequence>)
637+
(parser :: <command-line-parser>, argv :: <sequence>,
638+
usage :: false-or(<string>), description :: false-or(<string>))
643639
=> ()
644640
// Split our args around '--' and chop them around '='.
645641
let (clean-args, extra-args) = split-args(argv);
@@ -676,6 +672,13 @@ define function %parse-command-line
676672
end select;
677673
end while;
678674

675+
// Handle help prior to validating positional options.
676+
if (parser.provide-help-option? & parser.help-option.option-value)
677+
print-synopsis(parser, *standard-output*,
678+
usage: usage, description: description);
679+
error(make(<help-requested>));
680+
end;
681+
679682
// And append any more positional options from after the '--'.
680683
for (arg in extra-args)
681684
parser.positional-options := add!(parser.positional-options, arg);

tests/command-line-parser-test-suite.dylan

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ define test test-min-max-positional-options ()
269269
assert-no-errors(parse-command-line(parser, #["a"]), "abc");
270270
assert-no-errors(parse-command-line(parser, #["a", "b"]), "xxx");
271271
assert-signals(<usage-error>, parse-command-line(parser, #["a", "b", "c"]), "yyy");
272+
assert-signals(<help-requested>, parse-command-line(parser, #["-h"]));
272273
end test test-min-max-positional-options;
273274

274275
define suite command-line-parser-test-suite

0 commit comments

Comments
 (0)