emhell-0.1.1.0: src/EmHell/SVD/Selector.hs
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE OverloadedStrings #-}
module EmHell.SVD.Selector
( Selector(..)
, parseSelector
, parseSelectorValue
) where
import Data.Bits (Bits)
import Control.Applicative
import Data.Attoparsec.Text
import qualified Data.Text
import qualified Data.Char
data Selector a = Selector {
selPeriph :: a
, selReg :: a
, selField :: Maybe a
}
deriving (Eq, Ord, Show, Functor)
nameParser :: Parser String
nameParser = many1 (letter <|> digit <> char '_')
-- | Parse Periph.Reg.Field selector
selectorParser :: Parser (Selector String)
selectorParser = do
p <- nameParser
_ <- char '.'
r <- nameParser
f <- optional (char '.' *> nameParser)
pure
$ map Data.Char.toLower
<$> Selector p r f
selectorValueParser
:: ( Integral a
, Bits a
)
=> Parser (Selector String, a)
selectorValueParser = do
s <- selectorParser
skipSpace
_ <- char '='
skipSpace
v <- optional "0x" *> hexadecimal
pure (s, v)
parseSelector
:: String
-> Either String (Selector String)
parseSelector =
parseOnly selectorParser
. Data.Text.pack
parseSelectorValue
:: ( Integral a
, Bits a
)
=> String
-> Either String (Selector String, a)
parseSelectorValue =
parseOnly selectorValueParser
. Data.Text.pack