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]
Я тестирую свой анализатор аргументов с помощью следующего кода;
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 биллинг".
Приведенный выше тестовый код дает следующий вывод, если я печатаю результат,
Left (MissingError (MultNode [MultNode [MultNode [AltNode [Leaf (Chunk {unChunk = Just --sql <SQL SELECT statement>})]]]]))
Есть ли способ создать ожидаемое сообщение об ошибке (String) из приведенного выше результата (любой тип данных)? Предоставляет ли Haskell очевидную функцию, которую можно использовать для этой цели, так как я не могу найти что-то в документации, и поиск примеров также не дал никаких ответов.
1 ответ
Если вы посмотрите на хранилище исходного кода для optparse-applicative
(ссылка) вы увидите, что он сам имеет набор тестов в 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
это сообщение об ошибке