module Puppet.Parser.Types
(
Position,
PPosition,
initialPPos,
toPPos,
lSourceName,
lSourceLine,
lSourceColumn,
capitalize',
capitalizeRT,
array,
toBool,
Expression(..),
SelectorCase(..),
UValue(..),
HigherFuncType(..),
HFunctionCall(..),
HasHFunctionCall(..),
BlockParameters(..),
CollectorType(..),
Virtuality(..),
NodeDesc(..),
SearchExpression(..),
Statement(..)
) where
import qualified Data.Text as T
import qualified Data.Vector as V
import Data.Tuple.Strict
import qualified Data.Maybe.Strict as S
import GHC.Generics
import Data.Char (toUpper)
import Text.Regex.PCRE.String
import Control.Lens
import Text.Parsec.Pos
capitalizeRT :: T.Text -> T.Text
capitalizeRT = T.intercalate "::" . map capitalize' . T.splitOn "::"
capitalize' :: T.Text -> T.Text
capitalize' t | T.null t = T.empty
| otherwise = T.cons (toUpper (T.head t)) (T.tail t)
type PPosition = Pair Position Position
type Position = SourcePos
lSourceName :: Lens' Position SourceName
lSourceName = lens sourceName setSourceName
lSourceLine :: Lens' Position Line
lSourceLine = lens sourceLine setSourceLine
lSourceColumn :: Lens' Position Column
lSourceColumn = lens sourceColumn setSourceColumn
initialPPos :: T.Text -> PPosition
initialPPos x =
let i = initialPos (T.unpack x)
in (i :!: i)
toPPos :: T.Text -> Int -> PPosition
toPPos fl ln =
let p = newPos (T.unpack fl) ln (1)
in (p :!: p)
data HigherFuncType = HFEach
| HFMap
| HFReduce
| HFFilter
| HFSlice
deriving Eq
data BlockParameters = BPSingle !T.Text
| BPPair !T.Text !T.Text
deriving Eq
data HFunctionCall = HFunctionCall { _hftype :: !HigherFuncType
, _hfexpr :: !(S.Maybe Expression)
, _hfparams :: !BlockParameters
, _hfstatements :: !(V.Vector Statement)
, _hfexpression :: !(S.Maybe Expression)
}
deriving Eq
data UValue
= UBoolean !Bool
| UString !T.Text
| UInterpolable !(V.Vector UValue)
| UUndef
| UResourceReference !T.Text !Expression
| UArray !(V.Vector Expression)
| UHash !(V.Vector (Pair Expression Expression))
| URegexp !T.Text !Regex
| UVariableReference !T.Text
| UFunctionCall !T.Text !(V.Vector Expression)
| UHFunctionCall !HFunctionCall
instance Eq UValue where
(==) (UBoolean a) (UBoolean b) = a == b
(==) (UString a) (UString b) = a == b
(==) (UInterpolable a) (UInterpolable b) = a == b
(==) UUndef UUndef = True
(==) (UResourceReference a1 a2) (UResourceReference b1 b2) = (a1 == b1) && (a2 == b2)
(==) (UArray a) (UArray b) = a == b
(==) (UHash a) (UHash b) = a == b
(==) (URegexp a _) (URegexp b _) = a == b
(==) (UVariableReference a) (UVariableReference b) = a == b
(==) (UFunctionCall a1 a2) (UFunctionCall b1 b2) = (a1 == b1) && (a2 == b2)
(==) _ _ = False
array :: [Expression] -> UValue
array = UArray . V.fromList
data SelectorCase = SelectorValue UValue
| SelectorDefault
deriving (Eq)
data Expression
= Equal !Expression !Expression
| Different !Expression !Expression
| Not !Expression
| And !Expression !Expression
| Or !Expression !Expression
| LessThan !Expression !Expression
| MoreThan !Expression !Expression
| LessEqualThan !Expression !Expression
| MoreEqualThan !Expression !Expression
| RegexMatch !Expression !Expression
| NotRegexMatch !Expression !Expression
| Contains !Expression !Expression
| Addition !Expression !Expression
| Substraction !Expression !Expression
| Division !Expression !Expression
| Multiplication !Expression !Expression
| Modulo !Expression !Expression
| RightShift !Expression !Expression
| LeftShift !Expression !Expression
| Lookup !Expression !Expression
| Negate !Expression
| ConditionalValue !Expression !(V.Vector (Pair SelectorCase Expression))
| FunctionApplication !Expression !Expression
| PValue !UValue
deriving (Eq)
data SearchExpression
= EqualitySearch !T.Text !Expression
| NonEqualitySearch !T.Text !Expression
| AndSearch !SearchExpression !SearchExpression
| OrSearch !SearchExpression !SearchExpression
| AlwaysTrue
deriving Eq
data CollectorType = Collector | ExportedCollector
deriving (Eq)
toBool :: UValue -> Bool
toBool (UString "") = False
toBool (UInterpolable v) = not (V.null v)
toBool UUndef = False
toBool (UBoolean x) = x
toBool _ = True
data Virtuality = Normal
| Virtual
| Exported
| ExportedRealized
deriving (Generic, Eq)
data NodeDesc = NodeName !T.Text
| NodeMatch !T.Text !Regex
| NodeDefault
instance Eq NodeDesc where
(==) (NodeName a) (NodeName b) = a == b
(==) NodeDefault NodeDefault = True
(==) (NodeMatch a _) (NodeMatch b _) = a == b
(==) _ _ = False
data Statement
= ResourceDeclaration !T.Text !Expression !(V.Vector (Pair T.Text Expression)) !Virtuality !PPosition
| DefaultDeclaration !T.Text !(V.Vector (Pair T.Text Expression)) !PPosition
| ResourceOverride !T.Text !Expression !(V.Vector (Pair T.Text Expression)) !PPosition
| ConditionalStatement !(V.Vector (Pair Expression (V.Vector Statement))) !PPosition
| ClassDeclaration !T.Text !(V.Vector (Pair T.Text (S.Maybe Expression))) !(S.Maybe T.Text) !(V.Vector Statement) !PPosition
| DefineDeclaration !T.Text !(V.Vector (Pair T.Text (S.Maybe Expression))) !(V.Vector Statement) !PPosition
| Node !NodeDesc !(V.Vector Statement) !(S.Maybe NodeDesc) !PPosition
| VariableAssignment !T.Text !Expression !PPosition
| MainFunctionCall !T.Text !(V.Vector Expression) !PPosition
| SHFunctionCall !HFunctionCall !PPosition
| ResourceCollection !CollectorType !T.Text !SearchExpression !(V.Vector (Pair T.Text Expression)) !PPosition
| Dependency !(Pair T.Text Expression) !(Pair T.Text Expression) !PPosition
| TopContainer !(V.Vector Statement) !Statement
deriving Eq
makeClassy ''HFunctionCall