2015-10-18 73 views
2

我想使用cmdargs將參數傳遞給我的Haskell程序。出於某些原因,我希望在cmdargs幫助消息中隱藏某些選項(未顯示但可用)。使用cmdargs隱藏參數

有沒有辦法做到這一點?

我正在使用cmdargs 0.10.9。

回答

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 

其中myApplycmdArgsApply的一個版本,它發出編輯的 版本的幫助文本。

這裏是工作示例。幫助文本中不會顯示選項-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 [email protected]{..} 
    | Just x <- cmdArgsHelp = do putStr (fixupHelp x); exitSuccess 
    | otherwise    = cmdArgsApply b 

fixupHelp = unlines 
       . filter (not . ("HIDDEN OPTION" `isInfixOf`)) 
       . lines