{-# LANGUAGE OverloadedLists #-}
module Helpers ( compileCatalog
, getCatalog
, getResource
, getAttribute
, spretty
) where
import Puppet.Interpreter (computeCatalog)
import Puppet.Interpreter.Pure
import Puppet.Interpreter.Types
import Puppet.Parser
import Puppet.Parser.Types
import Puppet.PP
import Control.Lens
import qualified Data.HashMap.Strict as HM
import qualified Data.Maybe.Strict as S
import Data.Text (Text, unpack)
compileCatalog :: Monad m => Text -> m (FinalCatalog, EdgeMap, FinalCatalog, [Resource], InterpreterState)
compileCatalog input = do
statements <- either (fail . show) return (runPParser "dummy" input)
let nodename = "node.fqdn"
sttmap = [( (TopNode, nodename), NodeDeclaration (NodeDecl (NodeName nodename) statements S.Nothing (initialPPos "dummy")) ) ]
(res, finalState, _) = pureEval dummyFacts sttmap (computeCatalog nodename)
(catalog,em,exported,defResources) <- either (fail . show) return res
return (catalog,em,exported,defResources,finalState)
getCatalog :: Monad m => Text -> m FinalCatalog
getCatalog = fmap (view _1) . compileCatalog
spretty :: Pretty a => a -> String
spretty = flip displayS "" . renderCompact . pretty
getResource :: Monad m => RIdentifier -> FinalCatalog -> m Resource
getResource resid catalog = maybe (fail ("Unknown resource " ++ spretty resid)) return (HM.lookup resid catalog)
getAttribute :: Monad m => Text -> Resource -> m PValue
getAttribute att res = case res ^? rattributes . ix att of
Nothing -> fail ("Unknown attribute: " ++ unpack att)
Just x -> return x