gpt4 book ai didi

haskell - 如何在 optparse-applicative 生成​​的帮助消息中为缺少的命令指定名称?

转载 作者:行者123 更新时间:2023-12-04 11:47:29 24 4
gpt4 key购买 nike

我正在尝试使用 Hackage 的 optparse-applicative包并有一个关于如何指定在指定命令不足的情况下运行程序时显示的帮助消息的某个方面的问题。

以下示例程序说明了我的问题。从命令行运行时,它将两个命令之一作为输入。也就是说,它打算作为 $ program com1 运行。或 $ program com2 .

module Main where

import Options.Applicative
import Data.Semigroup ((<>))

data Command = Com1
| Com2

com1 :: Parser Command
com1 = subparser $ command "com1" $ info (pure Com1) fullDesc

com2 :: Parser Command
com2 = subparser $ command "com2" $ info (pure Com2) fullDesc

commandParser :: Parser Command
commandParser = com1
<|> com2

runCommand :: Command -> IO ()
runCommand Com1 = putStrLn ">>> Com1 <<<"
runCommand Com2 = putStrLn ">>> Com2 <<<"

opts :: ParserInfo Command
opts = info (commandParser <**> helper)
$ fullDesc
<> progDesc "=== progDesc ==="
<> header "=== header ==="
<> footer "=== footer ==="

main :: IO ()
main = runCommand =<< execParser opts

当这个程序没有使用命令 com1 运行时也不是 com2指定,将显示帮助消息。
$ program
Missing: (COMMAND | COMMAND)

Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===

此帮助消息显示 (COMMAND | COMMAND)而不是 (com1 | com2) ,并且我认为在此帮助消息中指定名称会更清晰,更有用。

指定 --help $ program --help 中的选项给出不同的输出。
$ program --help
=== header ===

Usage: options-applicative-example-exe (COMMAND | COMMAND)
=== progDesc ===

Available options:
-h,--help Show this help text

Available commands:
com1
com2

=== footer ===

命令名称 com1com2列在“可用命令”部分。然而,在这里,我认为使用部分会更清楚 (com1 | com2)而不是 (COMMAND | COMMAND) .

如何将帮助消息的使用部分指定为 (com1 | com2)而不是 (COMMAND | COMMAND) ?

最佳答案

看来你可以使用metavar在命令上。

com1 = subparser $ mconcat
[ metavar c
, command c $ info (pure Com1) fullDesc)
] where c = "com1"

而这里每个命令都是它自己的子解析器, optparse-applicative 的文档更喜欢结合 command在应用 subparser 之前先进行修饰符总的来说,所以我们只会看到一个 COMMANDmetavar不会很好地工作。

关于haskell - 如何在 optparse-applicative 生成​​的帮助消息中为缺少的命令指定名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48144402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com