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)