mima-tools/src/Mima/Parse/FlagFile.hs
2019-12-03 23:24:12 +00:00

44 lines
1.1 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Mima.Parse.FlagFile
( parseFlagFile
, readFlagFile
) where
import Control.Monad
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as T
import Text.Megaparsec
import Mima.Flag
import Mima.Parse.Common
import Mima.Parse.Lexeme
import Mima.Parse.Weed
import Mima.Word
lAddress :: Parser MimaAddress
lAddress = lexeme fixedWidthHexAddress
lFlags :: Parser (Set.Set Char)
lFlags = Set.unions <$> some (lexeme flag)
lAddressRange :: Parser AddressRange
lAddressRange = do
firstAddress <- lAddress
secondAddress <- (symbol "-" *> lAddress) <|> pure firstAddress
pure $ range firstAddress secondAddress
lLine :: Parser (AddressRange, Set.Set Char)
lLine = do
a <- lAddressRange
void $ symbol ":"
f <- lFlags
hidden lNewlines
pure (a, f)
parseFlagFile :: Parser RawFlags
parseFlagFile = space *> many lNewline *> (Map.fromList <$> many lLine) <* hidden eof
readFlagFile :: FilePath -> T.Text -> Either WeedErrorBundle RawFlags
readFlagFile = parse parseFlagFile