packages feed

cloudy-0.1.0.0: src/Cloudy/InstanceSetup/Types.hs

{-# LANGUAGE DeriveAnyClass #-}

module Cloudy.InstanceSetup.Types where

import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON(..), ToJSON (..), object, (.=), FromJSON, withObject, (.:))
import Data.Text (Text)
import GHC.Generics (Generic)

data InstanceSetup = InstanceSetup
  { name :: Text
  , instanceSetupData :: InstanceSetupData
  , rawInstanceSetupData :: Text
  }
  deriving stock (Eq, Generic, Show)
  deriving anyclass (NFData)

instance ToJSON InstanceSetup where
  toJSON InstanceSetup{name, instanceSetupData, rawInstanceSetupData} =
    object
      [ "name" .= name
      , "data" .= instanceSetupData
      , "raw" .= rawInstanceSetupData
      ]

instance FromJSON InstanceSetup where
  parseJSON = withObject "InstanceSetup" $ \o -> do
    name <- o .: "name"
    instanceSetupData <- o .: "data"
    rawInstanceSetupData <- o .: "raw"
    pure InstanceSetup { name, instanceSetupData, rawInstanceSetupData }

data InstanceSetupData = InstanceSetupData
  { shortDescription :: Text
  , cloudInitUserData :: Text
  }
  deriving stock (Eq, Generic, Show)
  deriving anyclass (NFData)

instance ToJSON InstanceSetupData where
  toJSON InstanceSetupData{shortDescription, cloudInitUserData} =
    object
      [ "short-description" .= shortDescription
      , "cloud-init-user-data" .= cloudInitUserData
      ]

instance FromJSON InstanceSetupData where
  parseJSON = withObject "InstanceSetupData" $ \o -> do
    shortDescription <- o .: "short-description"
    cloudInitUserData <- o .: "cloud-init-user-data"
    pure InstanceSetupData { shortDescription, cloudInitUserData }