Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-从任一数据类型生成缺少参数的错误消息_Haskell_Testing_Optionparser - Fatal编程技术网

Haskell-从任一数据类型生成缺少参数的错误消息

Haskell-从任一数据类型生成缺少参数的错误消息,haskell,testing,optionparser,Haskell,Testing,Optionparser,我有下面的代码 module Billing.Options ( GlobalOpts(..) , globalOptsParser , parseDb , parseSql ) where import Options.Applicative import Options.Applicative.Simple import Options.Applicative.Types import System.FilePath.Posix import T

我有下面的代码

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 <DB name>
  --sql <SQL SELECT statement>
-d
--sql
我想测试我是否收到错误消息

Missing: --sql <SQL SELECT statement>
缺少:--sql
当我只指定“-d账单”时

如果我打印结果,上面的测试代码将给出以下输出

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

是否有方法从上述结果(数据类型)生成预期的错误消息(字符串)?Haskell是否提供了一个用于此目的的明显功能,因为我在文档中找不到一些内容,而谷歌搜索示例也没有给出任何答案。

如果您查看
optparse applicative
的源代码存储库,您会看到它本身在
tests
子目录中有一个测试套件

文件
tests/Test.hs
中有一个例程,它看起来与您想要的非常相似:

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

renderFailure
返回的字符串是错误消息。

Haskell有无数个命令行选项库,因此您真的应该告诉我们您正在使用的库,并包括您的导入。很抱歉,我已更新了我的问题。@TresiaBurger so。。。。您正在使用
http://hackage.haskell.org/package/optparse-applicative
然后呢?是的,这就是我正在使用的。
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
execParserPure :: ParserPrefs -> ParserInfo a -> [String] -> ParserResult a

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