2016-06-30 1 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>})]]]])) 

위의 결과 (어느 데이터 유형)에서 예상되는 오류 메시지 (String)를 생성하는 방법이 있나요, 다음과 같은 출력을 제공합니다? 하스켈은 설명서에서 뭔가를 찾을 수없고 예를 들어 인터넷 검색이 응답을 생성하지 않았기 때문에이 목적을 위해 사용하기 쉬운 기능을 제공합니까?

+3

하스켈 용 명령 줄 옵션 라이브러리가 너무 많아서 사용중인 라이브러리를 알려주고 가져 오기를 포함시켜야합니다. – ErikR

+0

죄송합니다. 제 질문을 업데이트했습니다. –

+0

@TresiaBurger 그럼 ....'http : // hackage.haskell.org/package/optparse-applicative'를 사용하고 있습니까? –

답변

2

optparse-applicative 에 대한 소스 코드 저장소를 보면 그 자체가 tests 하위 디렉토리에 테스트 스위트가 있음을 알 수 있습니다.

보이는 일상은 당신이 원하는 것을 같은 많은 파일 tests/Test.hscheckHelpTextWith이다하는 것처럼 :

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에 의해 반환되는 문자열은 오류 메시지입니다.

관련 문제