module Puppet.Printers (
showRes
, showRRes
, showFCatalog
, showValue
, showRRef
, capitalizeResType
, showScope
) where
import Puppet.Interpreter.Types
import Puppet.DSL.Types
import qualified Data.Map as Map
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Puppet.Utils
import Data.List (groupBy,sort)
showRes (CResource _ rname rtype params virtuality _ _) = T.putStrLn $ rtype <> " " <> tshow rname <> " " <> tshow params <> " " <> tshow virtuality
showRRes (RResource _ rname rtype params relations _ _) = T.putStrLn $ rtype <> " " <> tshow rname <> " " <> tshow params <> " " <> tshow relations
showFCatalog :: FinalCatalog -> T.Text
showFCatalog rmap = let
rawlist = groupBy (\((rtype1,_), _) ((rtype2,_), _) -> rtype1 == rtype2) (sort $ Map.toList rmap)
rlist = map (map snd) rawlist
out = T.concat$ map showuniqueres rlist
in out
commasep :: [T.Text] -> T.Text
commasep = T.intercalate ", "
commaretsep :: [T.Text] -> T.Text
commaretsep = T.intercalate ",\n"
showRRef :: ResIdentifier -> T.Text
showRRef (rt, rn) = capitalizeResType rt <> "[" <> rn <> "]"
showValue :: ResolvedValue -> T.Text
showValue (ResolvedString x) = tshow x
showValue (ResolvedInt x) = tshow x
showValue (ResolvedDouble x) = tshow x
showValue (ResolvedBool True) = "True"
showValue (ResolvedBool False) = "False"
showValue (ResolvedRReference rt rn) = showRRef (rt, showValue rn)
showValue (ResolvedArray ar) = "[" <> commasep (map showValue ar) <> "]"
showValue (ResolvedHash h) = "{" <> commasep (map (\(k,v) -> k <> " => " <> showValue v) h) <> "}"
showValue (ResolvedRegexp r) = "/" <> r <> "/"
showValue (ResolvedUndefined) = "undef"
showuniqueres :: [RResource] -> T.Text
showuniqueres res = mrtype <> " {\n" <> T.concat (map showrres res) <> "}\n"
where
showrres (RResource _ rname _ params rels scopes mpos) =
let relslist = map asparams rels
groupedrels = Map.fromListWith (<>) relslist :: Map.Map T.Text [ResolvedValue]
maybeArray (s,[a]) = (s,a)
maybeArray (s, x ) = (s,ResolvedArray x)
paramlist = (Map.toList $ Map.delete "title" params) <> map maybeArray (Map.toList groupedrels) :: [(T.Text, ResolvedValue)]
maxlen = maximum (map (T.length . fst) paramlist) :: Int
in " " <> tshow rname <> ":" <> " #" <> tshow mpos <> " " <> showScope scopes <> "\n"
<> commaretsep (map (showparams maxlen) paramlist) <> ";\n"
showparams mxl (name, val) = " " <> T.justifyLeft 15 ' ' name <> " => " <> showValue val
asparams (RBefore, (dtype, dname)) = ("before", [ResolvedRReference dtype (ResolvedString dname)])
asparams (RNotify, (dtype, dname)) = ("notify", [ResolvedRReference dtype (ResolvedString dname)])
asparams (RSubscribe, (dtype, dname)) = ("subscribe", [ResolvedRReference dtype (ResolvedString dname)])
asparams (RRequire, (dtype, dname)) = ("require", [ResolvedRReference dtype (ResolvedString dname)])
mrtype = rrtype (head res)