- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下一段代码;
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]
我正在使用以下代码测试我的参数解析器;
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>
当我只指定“-d billing”时。
如果我打印结果,上面的测试代码会给出以下输出,
Left (MissingError (MultNode [MultNode [MultNode [AltNode [Leaf (Chunk {unChunk = Just --sql <SQL SELECT statement>})]]]]))
有没有办法从上述结果(任一数据类型)生成预期的错误消息(字符串)? Haskell 是否提供了一个明显的函数用于此目的,因为我在文档中找不到任何东西并且谷歌搜索示例也没有产生任何答案。
最佳答案
如果您查看optparse-applicative
的源代码存储库 (link)您会看到它本身在 tests
子目录中有一个测试套件。
一个看起来很像你想要的例程是checkHelpTextWith
在文件 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
此函数预计选项解析器会失败,并将错误消息与文件内容进行比较。
感兴趣的主要函数是:
execParserPure :: ParserPrefs -> ParserInfo a -> [String] -> ParserResult a
renderFailure :: ParserFailure ParserHelp -> String -> (String, ExitCode)
renderFailure
返回的字符串是错误信息。
关于Haskell - 从任一数据类型生成缺少参数错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38131871/
使用cats.Semigroup可以这样写: import cats.Semigroup import cats.implicits._ val l1: String Either Int = Lef
所以我的网页中有两个字段,一个用于电话号码,另一个用于电子邮件地址,我需要使用 JavaScript 而不是 jQuery 来填写其中之一。我在这里找到的大多数答案都是针对 jQuery 的,任何使用
我有一个类型,它的形状是这样的: val myType: Future[Either[MyError, TypeA]] = // some value 我知道我可以对此进行模式匹配并获得 Right
我的印象是某处有 Either a 的实例,但我似乎找不到它。我尝试导入 Control.Monad、Control.Monad.Instances 和 Data.Either,如图所示 module
我在一个宠物 Scala 项目中遇到了一个我真的不知道如何克服的情况。 以下示例显示了我的问题。 import scala.concurrent.Future import scala.concurr
我是一名优秀的程序员,十分优秀!