{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Cmt.Parser.Config.Parts
( partsP
) where
import ClassyPrelude
import Data.Attoparsec.Text
import Cmt.Parser.Attoparsec
import Cmt.Types.Config
changedP :: Parser PartType
changedP = char '%' $> Changed
lineP :: Parser PartType
lineP = char '@' $> Line
linesP :: Parser PartType
linesP = string "!@" $> Lines
listItemP :: Parser Text
listItemP = stripComments $ char '"' *> tnotChar '"' <* char '"' <* chopt ','
listP :: Parser PartType
listP = Options <$> (char '[' *> many' listItemP <* char ']')
nameP :: Parser Text
nameP = char '"' *> wordsP <* char '"' <* lexeme (char '=')
partP :: Parser Part
partP = stripComments $ Part <$> nameP <*> (listP <|> lineP <|> linesP <|> changedP)
partsP :: Parser [Part]
partsP = stripComments $ stripComments (char '{') *> many' partP <* stripComments (char '}')