2014-12-01 17 views
1

。但是,我們並不完全滿意現在所做的事情。子命令之間有很多共享選項 - 例如,用戶名,開始日期和結束日期等。命令行參數解析,它支持目前我們使用<code>System.Console.CmdArgs</code>解析命令行參數共享參數

是否存在Haskell命令行解析庫,它支持「繼承」或可以接受列表的子命令輸入函數並自動派生一個解析器?我們的目標是避免鍋爐板,我們現在有很多。

我們的子命令的一些例子:

sum-payments [--start] [--end] [user] 
list-users-seen [--start] [--end] 
sum-queries [--start] [--end] 

所有的子命令支持startend選項,默認值是始終「的時間開始」和「現在」。每個子命令可能有自己的選項或位置參數。

+0

在這裏,您嘗試解析的命令的說明性示例將非常有用。 – Jubobs 2014-12-01 20:27:07

+0

SO不是要求圖書館推薦的地方。 – Bakuriu 2014-12-01 20:38:17

+0

...所以不是,你描述你所面臨的問題,當前解決方案和磚牆,有人可以建議使用一個不同的庫,如果這是一個合適的解決方案。 – AndrewC 2014-12-01 23:54:37

回答

3

這裏是你可以用optparse-applicative做一個簡單的例子。

注意startEnd分析器是如何在listUsers解析器的內部使用。所述startEnd解析器可在需要開始和結束的選擇的任何其它解析器使用。

import Options.Applicative 

data StartEnd = StartEnd String String 
    deriving (Show) 

data ListUsers = ListUsers { user :: String, bounds :: StartEnd } 
    deriving (Show) 

startEnd :: Parser StartEnd 
startEnd = StartEnd 
    <$> strOption (long "start") 
    <*> strOption (long "end") 

listUsers :: Parser ListUsers 
listUsers = ListUsers <$> strOption (long "user") <*> startEnd 

doListUsers :: ListUsers -> IO() 
doListUsers lusers = print lusers 

main :: IO() 
main = execParser opts >>= doListUsers 
    where 
    opts = info (helper <*> listUsers) 
     (fullDesc 
    <> progDesc "Print a greeting for TARGET" 
    <> header "hello - a test for optparse-applicative")