{-# LANGUAGE OverloadedLists #-}
module Cmt.Parser.Arguments
( parse
) where
import ClassyPrelude
import Data.Attoparsec.Text hiding (parse)
import Cmt.Parser.Attoparsec (ifP, lexeme, wordP)
import Cmt.Types.App (Settings (Settings))
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
settingsP :: Parser Next -> Parser (Settings, Next)
settingsP p = do
dry <- ifP (string "--dry-run" *> skipSpace)
colour <- not <$> ifP (string "--no-color" *> skipSpace)
next <- p
let settings = Settings dry colour
pure (settings, next)
argumentsP :: Parser (Settings, Next)
argumentsP =
lexeme $
settingsP (helpP <|> versionP <|> configLocationP <|> previousP <|> preDefinedP <|> continueP)
parse :: Text -> Either Text (Settings, Next)
parse arguments =
case parseOnly argumentsP arguments of
Right c -> Right c
Left _ -> Left "Could not parse arguments"