module Puppet.Lens
(
_PResolveExpression
, _PResolveValue
, _PHash
, _PBoolean
, _PString
, _PNumber
, _PResourceReference
, _PUndef
, _PArray
, _PParse
, _ResourceDeclaration
, _DefaultDeclaration
, _ResourceOverride
, _ConditionalStatement
, _ClassDeclaration
, _DefineDeclaration
, _Node
, _VariableAssignment
, _MainFunctionCall
, _SHFunctionCall
, _ResourceCollection
, _Dependency
, _TopContainer
, _Statements
, _Equal
, _Different
, _Not
, _And
, _Or
, _LessThan
, _MoreThan
, _LessEqualThan
, _MoreEqualThan
, _RegexMatch
, _NotRegexMatch
, _Contains
, _Addition
, _Substraction
, _Division
, _Multiplication
, _Modulo
, _RightShift
, _LeftShift
, _Lookup
, _Negate
, _ConditionalValue
, _FunctionApplication
, _PValue
) where
import Control.Lens
import Control.Applicative
import Puppet.PP (displayNocolor)
import Puppet.Parser.Types
import Puppet.Interpreter.Types
import Puppet.Interpreter.Pure
import Puppet.Interpreter.Resolve
import Puppet.Parser
import Puppet.Parser.PrettyPrinter (ppStatements)
import qualified Data.Vector as V
import qualified Data.HashMap.Strict as HM
import qualified Data.Text as T
import Data.Tuple.Strict hiding (uncurry)
import Text.Parser.Combinators (eof)
makePrisms ''PValue
makePrisms ''Statement
makePrisms ''Expression
_PResolveExpression :: Prism' Expression PValue
_PResolveExpression = prism reinject extract
where
extract e = case dummyEval (resolveExpression e) of
Right x -> Right x
Left _ -> Left e
reinject = PValue . review _PResolveValue
_PResolveValue :: Prism' UValue PValue
_PResolveValue = prism toU toP
where
toP uv = case dummyEval (resolveValue uv) of
Right x -> Right x
Left _ -> Left uv
toU (PBoolean x) = UBoolean x
toU (PNumber x) = UNumber x
toU PUndef = UUndef
toU (PString s) = UString s
toU (PResourceReference t n) = UResourceReference t (PValue (UString n))
toU (PArray r) = UArray (fmap (PValue . toU) r)
toU (PHash h) = UHash (V.fromList $ map (\(k,v) -> (PValue (UString k) :!: PValue (toU v))) $ HM.toList h)
_PParse :: Prism' T.Text (V.Vector Statement)
_PParse = prism dspl prs
where
prs i = case runPParser (puppetParser <* eof) "dummy" i of
Left _ -> Left i
Right x -> Right x
dspl = T.pack . displayNocolor . ppStatements
_Statements :: Lens' Statement [Statement]
_Statements = lens (V.toList . sget) (\s v -> sset s (V.fromList v))
where
sget :: Statement -> V.Vector Statement
sget (ClassDeclaration _ _ _ s _) = s
sget (DefineDeclaration _ _ s _) = s
sget (Node _ s _ _) = s
sget (TopContainer s _) = s
sget (SHFunctionCall (HFunctionCall _ _ _ s _) _) = s
sget _ = V.empty
sset :: Statement -> V.Vector Statement -> Statement
sset (ClassDeclaration n args inh _ p) s = ClassDeclaration n args inh s p
sset (Node ns _ nd' p) s = Node ns s nd' p
sset (DefineDeclaration n args _ p) s = DefineDeclaration n args s p
sset (TopContainer _ p) s = TopContainer s p
sset (SHFunctionCall (HFunctionCall t e pr _ e2) p) s = SHFunctionCall (HFunctionCall t e pr s e2) p
sset x _ = x