{-# LANGUAGE TemplateHaskell #-}
module Puppet.Language.WireCatalog
where
import XPrelude
import Data.Aeson
import Puppet.Language.Core
import Puppet.Language.Resource
data PuppetEdge = PuppetEdge RIdentifier RIdentifier LinkType deriving Show
instance FromJSON PuppetEdge where
parseJSON (Object v) = PuppetEdge <$> v .: "source" <*> v .: "target" <*> v .: "relationship"
parseJSON _ = fail "invalid puppet edge"
instance ToJSON PuppetEdge where
toJSON (PuppetEdge s t r) = object [("source", toJSON s), ("target", toJSON t), ("relationship", toJSON r)]
data WireCatalog = WireCatalog
{ _wireCatalogNodename :: !NodeName
, _wireCatalogVersion :: !Text
, _wireCatalogEdges :: !(Vector PuppetEdge)
, _wireCatalogResources :: !(Vector Resource)
, _wireCatalogTransactionUUID :: !Text
} deriving Show
makeClassy ''WireCatalog
instance FromJSON WireCatalog where
parseJSON (Object d) = d .: "data" >>= \case
(Object v) -> WireCatalog
<$> v .: "name"
<*> v .: "version"
<*> v .: "edges"
<*> v .: "resources"
<*> v .: "transaction-uuid"
_ -> fail "Data is not an object"
parseJSON _ = fail "invalid wire catalog"
instance ToJSON WireCatalog where
toJSON (WireCatalog n v e r t) = object [("metadata", object [("api_version", Number 1)]), ("data", object d)]
where d = [ ("name", String n)
, ("version", String v)
, ("edges", toJSON e)
, ("resources", toJSON r)
, ("transaction-uuid", String t)
]