{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
module Puppet.Preferences (
setupPreferences
, HasPreferences(..)
, Preferences(Preferences)
, HasPuppetDirPaths(..)
) where
import Puppet.Interpreter.Types
import Puppet.NativeTypes
import Puppet.NativeTypes.Helpers
import Puppet.Plugins
import Puppet.Stdlib
import Puppet.Utils
import PuppetDB.Dummy
import Control.Lens
import qualified Data.HashMap.Strict as HM
import qualified Data.HashSet as HS
import qualified Data.Text as T
data PuppetDirPaths = PuppetDirPaths
{ _baseDir :: FilePath -- ^ Puppet base working directory
, _manifestPath :: FilePath -- ^ The path to the manifests.
, _modulesPath :: FilePath -- ^ The path to the modules.
, _templatesPath :: FilePath -- ^ The path to the template.
}
makeClassy ''PuppetDirPaths
data Preferences m = Preferences
{ _puppetPaths :: PuppetDirPaths
, _prefPDB :: PuppetDBAPI m
, _natTypes :: Container NativeTypeMethods -- ^ The list of native types.
, _prefExtFuncs :: Container ( [PValue] -> InterpreterMonad PValue )
, _hieraPath :: Maybe FilePath
, _ignoredmodules :: HS.HashSet T.Text -- ^ The set of ignored modules
, _strictness :: Strictness
, _extraTests :: Bool
}
makeClassy ''Preferences
genPreferences :: FilePath
-> IO (Preferences IO)
genPreferences basedir = do
let manifestdir = basedir <> "/manifests"
modulesdir = basedir <> "/modules"
templatedir = basedir <> "/templates"
typenames <- fmap (map takeBaseName) (getFiles (T.pack modulesdir) "lib/puppet/type" ".rb")
let loadedTypes = HM.fromList (map defaulttype typenames)
return $ Preferences (PuppetDirPaths basedir manifestdir modulesdir templatedir) dummyPuppetDB (baseNativeTypes `HM.union` loadedTypes) (stdlibFunctions) (Just (basedir <> "/hiera.yaml")) mempty Strict True
{-| Use lens with the set operator and composition to set external/custom params.
Ex.: @ setupPreferences workingDir ((hieraPath.~mypath) . (prefPDB.~pdbapi)) @
-}
setupPreferences :: FilePath -- ^ The base working directory
-> (Preferences IO -> Preferences IO) -- ^ Preference setting
-> IO (Preferences IO)
setupPreferences basedir k =
fmap k (genPreferences basedir)