如果命令行的输入值不在 MAIN 例程的有效选择列表中,如何获得更好的错误提示?

che*_*nyf 7 program-entry-point raku

Python的click模块有choice-options,当输入无效时:

\n
import click\n\n@click.command()\n@click.option(\'--hash-type\',\n              type=click.Choice([\'MD5\', \'SHA1\'], case_sensitive=False))\n\ndef digest(hash_type):\n    click.echo(hash_type)\n\n# python demo.py --hash-type=HASH256\n# Error: Invalid value for \'--hash-type\': \'HASH256\' is not one of \'MD5\', \'SHA1\'.\nif __name__=="__main__":\n    digest()\n
Run Code Online (Sandbox Code Playgroud)\n

当用户输入无效的选择时,上面的脚本将退出,并为您打印出有效的选择,这很方便。

\n

我尝试用 Raku 重写它:

\n
# raku demo.raku --hash_type=HASH256\nsub MAIN(\n    :$hash_type where * \xe2\x88\x88 [\'MD5\', \'SHA1\'], #= the hash code\n) {\n    say $hash_type;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当提供无效选择时,Raku 仅输出用法,这不太好:

\n
Usage:\n  demo.raku [--hash_type[=Any where { ... }]]\n  --hash_type[=Any where { ... }]    the hash code\n
Run Code Online (Sandbox Code Playgroud)\n

那么,如果命令行输入的值不在 MAIN 例程中的有效选择列表中,如何获得更好的错误提示呢?

\n

wam*_*mba 8

enum HT <MD5 SHA1>; 

sub MAIN(
    HT :$hash_type!,
) {
    say $hash_type;
}
Run Code Online (Sandbox Code Playgroud)
Usage:
  -e '...' [--hash_type=<HT> (MD5 SHA1)]
  
    --hash_type=<HT> (MD5 SHA1)    the hash code
Run Code Online (Sandbox Code Playgroud)