packages feed

emhell-0.1: src/EmHell/SVD/Selector.hs

{-# LANGUAGE DeriveFunctor #-}
module EmHell.SVD.Selector where

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)

-- | Parse Periph.Reg.Field selector
selectorParser :: Parser (Selector String)
selectorParser = do
  p <- takeWhile1 (/='.')
  _ <- char '.'
  r <- takeWhile1 (/='.')
  f <- optional (char '.' *> takeWhile1 (pure True) <* endOfInput)
  pure
    $ map Data.Char.toLower
    . Data.Text.unpack
    <$> Selector p r f

parseSelector
  :: String
  -> Either String (Selector String)
parseSelector =
  parseOnly selectorParser
  . Data.Text.pack