2016-06-30 6 views
1

次のコードがあります。Haskell - いずれかのデータ型から欠落している引数エラーメッセージを生成します。

module Billing.Options 
    (
     GlobalOpts(..) 
    , globalOptsParser 
    , parseDb 
    , parseSql 
) where 

import Options.Applicative 
import Options.Applicative.Simple 
import Options.Applicative.Types 
import System.FilePath.Posix 
import Text.Regex.PCRE 

-- ------------------------------------------------------------ 

data GlobalOpts = GlobalOpts 
    { 
    optDb   :: String, 
    optSql   :: String 
    } deriving Show 

-- ------------------------------------------------------------ 

globalOptsParser :: Parser GlobalOpts 
globalOptsParser = GlobalOpts 
    <$> option (parseDb =<< readerAsk) 
    ( long "db" 
    <> short 'd' 
    <> metavar "<DB name>" 
    <> help "dmt | report" 
    ) 
    <*> option parseSql 
    ( long "sql" 
    <> metavar "<SQL SELECT statement>" 
    <> help "sql select statement to use in order to generate JSON config file" 
    ) 
-- ------------------------------------------------------------ 

matches :: String -> String -> Bool 
matches = (=~) 

-- ------------------------------------------------------------ 

parseDb :: String -> ReadM String 
parseDb val = do 
    if not (elem val ["dmt", "report"]) 
     then readerError $ "Unknown DB, '" ++ val ++ "'" 
     else return val 

-- ------------------------------------------------------------ 

parseSql :: ReadM String 
parseSql = do 
    val <- readerAsk 
    if not (val `matches` "(?i)select .+ from .+") 
     then readerError $ "Please provide a valid SQL SELECT statement" 
     else return val 

-- [EOF] 

私の引数パーサーは次のコードでテストしています。私は唯一の "-d課金" を指定

error' = let mp = runParser AllowOpts globalOptsParser ["-d", "billing"] 
      opts = ParserPrefs "suffix" False False False 80 
     in fst $ runP mp opts 

必要な引数があり、私はエラーメッセージを取得することをテストしたい

-d <DB name> 
    --sql <SQL SELECT statement> 

Missing: --sql <SQL SELECT statement> 

上記テストコードは、私は結果を印刷する場合、

Left (MissingError (MultNode [MultNode [MultNode [AltNode [Leaf (Chunk {unChunk = Just --sql <SQL SELECT statement>})]]]])) 

上記の結果(いずれかのデータ型)から予想されるエラーメッセージ(文字列)を生成する方法があり、以下の出力を与えますか?ハスケルは、ドキュメントで何かを見つけることができず、例についてグーグルが答えを出していないので、この目的のために使用する明確な関数を提供していますか?

+3

Haskell用のコマンドラインオプションライブラリがありますので、実際に使用しているライブラリを教えて、インポートを含める必要があります。 – ErikR

+0

謝罪、私は私の質問を更新しました。 –

+0

@TresiaBurgerだからあなたは 'http:// hackage.haskell.org/package/optparse-applicative'を使っていますか? –

答えて

2

optparse-applicative のソースコードリポジトリを見ると、それ自体がtestsサブディレクトリにテストスイートを持つことがわかります。この機能は、オプションのパーサが失敗することを期待して、ファイルの内容にエラーメッセージを比較

checkHelpTextWith :: Show a => ExitCode -> ParserPrefs -> String 
        -> ParserInfo a -> [String] -> Assertion 
checkHelpTextWith ecode pprefs name p args = do 
    let result = execParserPure pprefs p args 
    assertError result $ \failure -> do 
    expected <- readFile $ name ++ ".err.txt" 
    let (msg, code) = renderFailure failure name 
    expected @=? msg ++ "\n" 
    ecode @=? code 

それはあなたが望むように多くのことを行いますように見えるルーチンは、ファイルtests/Test.hscheckHelpTextWithです。関心の

主な機能は次のとおり

execParserPure :: ParserPrefs -> ParserInfo a -> [String] -> ParserResult a 

renderFailure :: ParserFailure ParserHelp -> String -> (String, ExitCode) 

renderFailureによって返される文字列はエラーメッセージです。

関連する問題