ert-0.0.1.1: library/Data/EasyTpl/Types.hs
module Data.EasyTpl.Types where
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Aeson (Value)
-- | Compiled template.
newtype Template = Template [TemplateToken] -- ^ Template consists of tokens
deriving (Show, Eq)
-- | Template token.
data TemplateToken = ContentToken ByteString -- ^ Chunk or raw content as is
| LiteralToken Expression -- ^ Computable expression for substitution
| ControlToken Control Template -- ^ Control block structure with sub-template
deriving (Show, Eq)
-- | Control structure.
data Control = Condition Expression -- ^ Conditional statement with expression
| Iteration (Text, Text) Expression -- ^ Iterational statement with variables and expression
deriving (Show, Eq)
-- | Expression.
data Expression = Constant Value --
| Variable Text
| Range Expression Expression Expression
#ifdef WITH_REGEX
| Regexp ByteString Bool Bool
#endif
| UnaryOperation UnaryOperator Expression
| BinaryOperation BinaryOperator Expression Expression
deriving (Show, Eq)
-- | Unary operator
data UnaryOperator = GetLength -- ^ Length operator `#` (#value)
| Stringify -- ^ Stringify operator `\@` (\@value)
| Evaluate -- ^ Evaluate operator `=` (value=)
| LogicNot -- ^ Logical not operator `!` (!value)
| Negate -- ^ Numeric negate operator `-` (-value)
| ToNumber -- ^ Numeric cast operator `+` (+value)
| NotNull -- ^ Not null test operator `?` (value?)
deriving (Show, Eq)
-- | Binary operator
data BinaryOperator = LogicOr -- ^ Logical or operator `||`
| LogicAnd -- ^ Logical and operator `&&`
| Equal -- ^ Generic equality operator `==`
| NotEqual -- ^ Generic non-equality operator `!=`
| LessThan -- ^ Lesser than operator `<`
| GreatThan -- ^ Greater than operator `>`
| LessEqual -- ^ Lesser or equal operator `<=`
| GreatEqual -- ^ Greater or equal operator `>=`
| Substract -- ^ Numeric substract operator `-`
| Append -- ^ Generic append operator `+`
| Multiply -- ^ Generic multiply operator `*`
| Divide -- ^ Generic divide operator `/`
| IntDivide -- ^ Generic integral divide operator `:`
| Module -- ^ Numeric module operator `%`
| Power -- ^ Numeric power operator `^`
| GetField -- ^ Container get field operator `.` | `[` `]` (object.field, object[field_name], array[index])
#ifdef WITH_REGEX
| RegexTest -- ^ Regular expression test operator `~` (string ~ /regex/ => bool)
| RegexMatch -- ^ Regular expression match operator `~>` (string ~> /regex/ => null | [matches])
| RegexSplit -- ^ Regular expression split operator `~:` (string ~: /regex/ => [pieces])
#endif
deriving (Show, Eq)