haiji-0.1.0.0: src/Text/Haiji/Syntax/Variable.hs
module Text.Haiji.Syntax.Variable
( Variable(..)
, variable
) where
import Data.Attoparsec.Text
import Text.Haiji.Syntax.Identifier
data Variable = VariableBase Identifier
| VariableAttribute Variable Identifier
deriving Eq
instance Show Variable where
show (VariableBase var) = show var
show (VariableAttribute var attr) = shows var "." ++ show attr
-- |
--
-- >>> let eval = either (error "parse error") id . parseOnly variable
-- >>> eval "foo"
-- foo
-- >>> eval "foo.bar"
-- foo.bar
-- >>> eval "foo.b}}ar"
-- foo.b
-- >>> eval "foo.b ar"
-- foo.b
-- >>> eval "foo.b }ar"
-- foo.b
-- >>> eval " foo.bar"
-- *** Exception: parse error
-- >>> eval "foo. bar"
-- foo.bar
-- >>> eval "foo .bar"
-- foo.bar
-- >>> eval "foo.bar "
-- foo.bar
-- >>> eval "foo.bar "
-- foo.bar
-- >>> eval "foo.bar.baz"
-- foo.bar.baz
--
variable :: Parser Variable
variable = identifier >>= go . VariableBase where
go var = do
skipSpace
peek <- peekChar
case peek of
Nothing -> return var
Just '}' -> return var
Just ' ' -> return var
Just '.' -> char '.' >> skipSpace >> identifier >>= go . VariableAttribute var
_ -> return var