{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE TupleSections #-}
module Cmt.Parser.Arguments
( parse
) where
import ClassyPrelude
import Data.Attoparsec.Text hiding (parse)
import Cmt.Parser.Attoparsec (ifP, lexeme, wordP)
import Cmt.Types.Config (Outputs)
import Cmt.Types.Next (Next (..))
outputsP :: Parser Outputs
outputsP =
lexeme $ do
message <- takeText
pure [("*", message)]
emptyOutputsP :: Parser Outputs
emptyOutputsP = endOfInput $> []
continueP :: Parser Next
continueP = Continue <$> (emptyOutputsP <|> outputsP)
preDefinedP :: Parser Next
preDefinedP = PreDefined <$> (string "-p" *> skipSpace *> wordP) <*> (emptyOutputsP <|> outputsP)
previousP :: Parser Next
previousP = string "--prev" $> Previous
configLocationP :: Parser Next
configLocationP = string "-c" $> ConfigLocation
versionP :: Parser Next
versionP = string "-v" $> Version
helpP :: Parser Next
helpP = string "-h" $> Help
dryRunP :: Parser Next -> Parser Next
dryRunP p = do
dry <- ifP (string "--dry-run" *> skipSpace)
next <- p
pure $ bool next (DryRun next) dry
argumentsP :: Parser Next
argumentsP =
lexeme
(helpP <|> versionP <|> configLocationP <|>
dryRunP (previousP <|> preDefinedP <|> continueP))
parse :: Text -> Next
parse arguments =
case parseOnly argumentsP arguments of
Right c -> c
Left _ -> Error "Could not parse arguments"