hedgehog-extras-0.9.0.0: src/Hedgehog/Extras/Internal/Plan.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NoFieldSelectors #-}
module Hedgehog.Extras.Internal.Plan
( Plan(..)
, Component(..)
) where
import Control.Applicative
import Control.Monad
import Data.Aeson
import qualified Data.Aeson as A
import qualified Data.Aeson.KeyMap as M
import Data.Eq
import Data.Function
import Data.Maybe
import Data.Text (Text)
import GHC.Generics
import Text.Show
data Component = Component
{ componentName :: Maybe Text
, binFile :: Maybe Text
, components :: [Component]
}
deriving (Generic, Eq, Show)
newtype Plan = Plan
{ installPlan :: [Component]
}
deriving (Generic, Eq, Show)
instance FromJSON Plan where
parseJSON = withObject "Plan" $ \v -> Plan
<$> v .: "install-plan"
instance FromJSON Component where
parseJSON = withObject "Plan" $ \v -> do
componentName <- v .:? "component-name"
binFile <- v .:? "bin-file"
componentsTuples <- join . maybeToList . fmap M.toAscList <$> v .:? "components"
-- sub-components are an object with components name as a key
components <- forM componentsTuples $ \(subComponentName, subComponent) ->
parseJSON $
A.Object $
M.insert "component-name" (toJSON subComponentName) subComponent
pure Component{..}