我想使用cmdargs将参数传递给我的Haskell程序。出于某些原因,我希望在cmdargs帮助消息中隐藏一些选项(未显示但可用)。
有没有办法做到这一点?
我正在使用cmdargs 0.10.9。
答案 0 :(得分:1)
这里的想法是拦截--help
处理并编辑
帮助文本在显示之前删除对隐藏选项的任何引用。
我们希望隐藏的选项可以使用特殊帮助文字进行标记(例如&= help "HIDDEN OPTION"
)
这些行可以从帮助输出中删除。
考虑这个简单的主程序:
main = cmdArgs sampleArgs >>= print
--help
出现时所采用的路径如下:
cmdArgs = cmdArgsRun . cmdArgsMode
cmdArgs m = cmdArgsApply =<< processArgs m
cmdArgsApply :: CmdArgs a -> IO a
cmdArgsApply CmdArgs{..}
| Just x <- cmdArgsHelp = do putStr x; exitSuccess
| Just x <- cmdArgsVersion = ...
| otherwise = ...
要拦截帮助处理,我们可以像这样编写main
:
main = do
b <- processArgs (cmdArgsMode sampleArgs)
a <- myApply b
print a
其中myApply
是发布已编辑的cmdArgsApply
的版本
帮助文本的版本。
这是一个有效的例子。选项-s
和--secret
不会显示在帮助文本中。尝试使用这些参数:
prog
prog --help
prog --version
prog -s1234
程序:
{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}
import Data.List (isInfixOf)
import System.Console.CmdArgs
import System.Console.CmdArgs.Explicit (processArgs)
import System.Exit (exitSuccess)
data MyArgs = MyArgs { file :: String, dest :: String, secret :: String }
deriving (Show, Data)
sample = MyArgs { file = "input.txt" &= help "the input file" &= opt "input"
, dest = "output.txt" &= help "the output file"
, secret = "3l33t" &= help "HIDDEN OPTION" &= opt "someflag"
}
main = do
b <- processArgs (cmdArgsMode sample)
a <- myApply b
putStrLn $ "running program with " ++ show a
myApply :: CmdArgs a -> IO a
myApply b@CmdArgs{..}
| Just x <- cmdArgsHelp = do putStr (fixupHelp x); exitSuccess
| otherwise = cmdArgsApply b
fixupHelp = unlines
. filter (not . ("HIDDEN OPTION" `isInfixOf`))
. lines