lz96
lz96

Reputation: 2998

Why is this docopt string not working either with or without optional args?

Here is the complete docopt string I used:

foo.

Usage:
    foo [options] <file> -o <output>
    foo --help | --version

Options:
    -h, --help          print this help message.
    --target <target>   target.
    --version           print the version.

According to the official parser, either foo a -o b or foo --target abc a -o b is not correctly parsed. What could be possible reasons for this case? Any help would be appreciated.

Upvotes: 1

Views: 510

Answers (2)

lz96
lz96

Reputation: 2998

Thanks for @RichVel's efforts. Yesterday I finally found out the underlying (stupid) cause for this problem.

In the official online parser the first part, i.e. foo shouldn't be used. --target abc a -o b works fine in the online example.

Regarding my question, the bug actually comes from that docopt.rs stores --target abc in flag_target instead of arg_target.

Upvotes: 1

RichVel
RichVel

Reputation: 8440

I'm not entirely sure about the allowed combinations of options for your script, but here's something that should be close.

Just for fun, I wrote a script that has similar options to yours to test this out with the latest docopts.

I found it simplest to write just [options] in the main Usage section, and have all the options below as alternatives, with no specific combinations required.

I'm on macOS so I'm using bash 3.2 (with patched docopts.sh to fix some Mac issues). You can avoid some of the code in this script if you're on bash 4.x - see the commented-out section with --auto option and docopt_print_ARGS function. Currently you would need bash 4.x to avoid patching docopts.sh.

#!/bin/bash
#
# foo.
#
# Usage:
#     foo [options] <file>
#     foo --help | --version
#
# Options:
#     -t, --target <target>   target.
#     -o, --output <output>   output.
#     -h, --help              print this help message.
#     --version               print the version.
#

# bash 3.2 (patched docopts.sh) - include set -x to see the args easily
source docopts.sh
usage=$(docopt_get_help_string "$0")
set -x
eval "$(docopts -G ARGS -V "$VERSION" -h "$usage" : "$@")"

# On bash 4.x, replace preceding section with this, or use -A instead of -G above
# source docopts.sh --auto "$@"
# docopt_print_ARGS

This parses the Usage section OK and processes command lines such as:

foo --target a -o b file1
foo --target a --output b file1
foo --target a file1

Partial output with set -x to show args processed correctly:

$ ./foo --target a file1 --output b
...
++ ARGS_target=a
++ ARGS_output=b
++ ARGS_file=file1
++ ARGS_help=false
++ ARGS_version=false

Upvotes: 1

Related Questions