cmdargs隐藏的参数

时间:2015-10-18 14:48:09

标签: haskell haskell-cmdargs

我想使用cmdargs将参数传递给我的Haskell程序。出于某些原因,我希望在cmdargs帮助消息中隐藏一些选项(未显示但可用)。

有没有办法做到这一点?

我正在使用cmdargs 0.10.9。

1 个答案:

答案 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