我想在我的 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" )
您可以使用./opt_ex.hs greet John
to getHello, John!
和 with ./opt_ex.hs groot John
to 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