我想在我的 Haskell 命令列工具中為子命令添加同義詞。例如summarise,summarize應該產生相同的結果。當然,我可以添加一個完全獨立的命令summarize,它在--help. 但也許有更優雅的方式。
這是堆疊腳本中的一個自包含示例opt_ex.hs:
#!/usr/bin/env stack
-- stack --resolver lts-18.17 script --package optparse-applicative
import Options.Applicative
import Data.Semigroup ((<>))
data Options = CmdGreet GreetArgs | CmdGroot GreetArgs
newtype GreetArgs = GreetArgs String
main :: IO ()
main = do
cmdOpts <- customExecParser (prefs showHelpOnEmpty) (info optParser fullDesc)
runCmd cmdOpts
optParser :: Parser Options
optParser = subparser (
command "greet" (info (CmdGreet <$> sample) (progDesc "Print greeting 1")) <>
command "groot" (info (CmdGroot <$> sample) (progDesc "Print greeting 2"))
)
runCmd :: Options -> IO ()
runCmd o = case o of
CmdGreet opts -> greet opts
CmdGroot opts -> groot opts
greet :: GreetArgs -> IO ()
greet (GreetArgs h) = putStrLn $ "Hello, " h "!"
groot :: GreetArgs -> IO ()
groot (GreetArgs h) = putStrLn $ "Howdy, " h "!"
sample :: Parser GreetArgs
sample = GreetArgs <$> strArgument ( metavar "TARGET" )
你可以運行這個 with ./opt_ex.hs greet Johnto getHello, John!和 with ./opt_ex.hs groot Johnto get Howdy, John!。運行./opt_ex.hs將為您提供以下概述:
Usage: opt_ex.hs COMMAND
Available commands:
greet Print greeting 1
groot Print greeting 2
gruut在這個例子中添加一個命令的最優雅的方式是什么,它的行為與 完全一樣greet,但在代碼和用戶中產生的開銷最少?
理想情況下,我想./opt_ex.hs產生這樣的東西:
Usage: opt_ex.hs COMMAND
Available commands:
greet|gruut Print greeting 1
groot Print greeting 2
uj5u.com熱心網友回復:
我不認為你能做到這一點。它適用于選項,因為 OptField 的定義包含一個 OptName 串列,并在您使用(<>). 但是 CommandFields 的定義,回傳的東西command,是
data CommandFields a = CommandFields
{ cmdCommands :: [(String, ParserInfo a)]
, cmdGroup :: Maybe String }
因此,每個字串名稱都與不同的 ParserInfo 相關聯。當然,您可以定義一個包含您喜歡的任何 ParserInfo 的變數,并在兩個命令中重復使用它,這樣您就不必重復 ParserInfo。但是就 optparse-applicative 而言,這兩個命令是不同的,因此它將在幫助文本中單獨列出。對于您的示例,這看起來像
optParser = let greeting1 = info (CmdGreet <$> sample) (progDesc "Print greeting 1")
in subparser $
command "greet" greeting1 <>
command "gruut" greeting1 <>
command "groot" (info (CmdGroot <$> sample) (progDesc "Print greeting 2"))
事實上,當運行時,我們會看到列出的兩個命令:
Usage: optparse COMMAND
Available commands:
greet Print greeting 1
gruut Print greeting 1
groot Print greeting 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363865.html
