{-# 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
  { InstanceSetup -> Text
name :: Text
  , InstanceSetup -> InstanceSetupData
instanceSetupData :: InstanceSetupData
  , InstanceSetup -> Text
rawInstanceSetupData :: Text
  }
  deriving stock (InstanceSetup -> InstanceSetup -> Bool
(InstanceSetup -> InstanceSetup -> Bool)
-> (InstanceSetup -> InstanceSetup -> Bool) -> Eq InstanceSetup
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InstanceSetup -> InstanceSetup -> Bool
== :: InstanceSetup -> InstanceSetup -> Bool
$c/= :: InstanceSetup -> InstanceSetup -> Bool
/= :: InstanceSetup -> InstanceSetup -> Bool
Eq, (forall x. InstanceSetup -> Rep InstanceSetup x)
-> (forall x. Rep InstanceSetup x -> InstanceSetup)
-> Generic InstanceSetup
forall x. Rep InstanceSetup x -> InstanceSetup
forall x. InstanceSetup -> Rep InstanceSetup x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. InstanceSetup -> Rep InstanceSetup x
from :: forall x. InstanceSetup -> Rep InstanceSetup x
$cto :: forall x. Rep InstanceSetup x -> InstanceSetup
to :: forall x. Rep InstanceSetup x -> InstanceSetup
Generic, Int -> InstanceSetup -> ShowS
[InstanceSetup] -> ShowS
InstanceSetup -> String
(Int -> InstanceSetup -> ShowS)
-> (InstanceSetup -> String)
-> ([InstanceSetup] -> ShowS)
-> Show InstanceSetup
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InstanceSetup -> ShowS
showsPrec :: Int -> InstanceSetup -> ShowS
$cshow :: InstanceSetup -> String
show :: InstanceSetup -> String
$cshowList :: [InstanceSetup] -> ShowS
showList :: [InstanceSetup] -> ShowS
Show)
  deriving anyclass (InstanceSetup -> ()
(InstanceSetup -> ()) -> NFData InstanceSetup
forall a. (a -> ()) -> NFData a
$crnf :: InstanceSetup -> ()
rnf :: InstanceSetup -> ()
NFData)

instance ToJSON InstanceSetup where
  toJSON :: InstanceSetup -> Value
toJSON InstanceSetup{Text
$sel:name:InstanceSetup :: InstanceSetup -> Text
name :: Text
name, InstanceSetupData
$sel:instanceSetupData:InstanceSetup :: InstanceSetup -> InstanceSetupData
instanceSetupData :: InstanceSetupData
instanceSetupData, Text
$sel:rawInstanceSetupData:InstanceSetup :: InstanceSetup -> Text
rawInstanceSetupData :: Text
rawInstanceSetupData} =
    [Pair] -> Value
object
      [ Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
name
      , Key
"data" Key -> InstanceSetupData -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= InstanceSetupData
instanceSetupData
      , Key
"raw" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
rawInstanceSetupData
      ]

instance FromJSON InstanceSetup where
  parseJSON :: Value -> Parser InstanceSetup
parseJSON = String
-> (Object -> Parser InstanceSetup)
-> Value
-> Parser InstanceSetup
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"InstanceSetup" ((Object -> Parser InstanceSetup) -> Value -> Parser InstanceSetup)
-> (Object -> Parser InstanceSetup)
-> Value
-> Parser InstanceSetup
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Text
name <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
    InstanceSetupData
instanceSetupData <- Object
o Object -> Key -> Parser InstanceSetupData
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"data"
    Text
rawInstanceSetupData <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"raw"
    InstanceSetup -> Parser InstanceSetup
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure InstanceSetup { Text
$sel:name:InstanceSetup :: Text
name :: Text
name, InstanceSetupData
$sel:instanceSetupData:InstanceSetup :: InstanceSetupData
instanceSetupData :: InstanceSetupData
instanceSetupData, Text
$sel:rawInstanceSetupData:InstanceSetup :: Text
rawInstanceSetupData :: Text
rawInstanceSetupData }

data InstanceSetupData = InstanceSetupData
  { InstanceSetupData -> Text
shortDescription :: Text
  , InstanceSetupData -> Text
cloudInitUserData :: Text
  }
  deriving stock (InstanceSetupData -> InstanceSetupData -> Bool
(InstanceSetupData -> InstanceSetupData -> Bool)
-> (InstanceSetupData -> InstanceSetupData -> Bool)
-> Eq InstanceSetupData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InstanceSetupData -> InstanceSetupData -> Bool
== :: InstanceSetupData -> InstanceSetupData -> Bool
$c/= :: InstanceSetupData -> InstanceSetupData -> Bool
/= :: InstanceSetupData -> InstanceSetupData -> Bool
Eq, (forall x. InstanceSetupData -> Rep InstanceSetupData x)
-> (forall x. Rep InstanceSetupData x -> InstanceSetupData)
-> Generic InstanceSetupData
forall x. Rep InstanceSetupData x -> InstanceSetupData
forall x. InstanceSetupData -> Rep InstanceSetupData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. InstanceSetupData -> Rep InstanceSetupData x
from :: forall x. InstanceSetupData -> Rep InstanceSetupData x
$cto :: forall x. Rep InstanceSetupData x -> InstanceSetupData
to :: forall x. Rep InstanceSetupData x -> InstanceSetupData
Generic, Int -> InstanceSetupData -> ShowS
[InstanceSetupData] -> ShowS
InstanceSetupData -> String
(Int -> InstanceSetupData -> ShowS)
-> (InstanceSetupData -> String)
-> ([InstanceSetupData] -> ShowS)
-> Show InstanceSetupData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InstanceSetupData -> ShowS
showsPrec :: Int -> InstanceSetupData -> ShowS
$cshow :: InstanceSetupData -> String
show :: InstanceSetupData -> String
$cshowList :: [InstanceSetupData] -> ShowS
showList :: [InstanceSetupData] -> ShowS
Show)
  deriving anyclass (InstanceSetupData -> ()
(InstanceSetupData -> ()) -> NFData InstanceSetupData
forall a. (a -> ()) -> NFData a
$crnf :: InstanceSetupData -> ()
rnf :: InstanceSetupData -> ()
NFData)

instance ToJSON InstanceSetupData where
  toJSON :: InstanceSetupData -> Value
toJSON InstanceSetupData{Text
$sel:shortDescription:InstanceSetupData :: InstanceSetupData -> Text
shortDescription :: Text
shortDescription, Text
$sel:cloudInitUserData:InstanceSetupData :: InstanceSetupData -> Text
cloudInitUserData :: Text
cloudInitUserData} =
    [Pair] -> Value
object
      [ Key
"short-description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
shortDescription
      , Key
"cloud-init-user-data" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
cloudInitUserData
      ]

instance FromJSON InstanceSetupData where
  parseJSON :: Value -> Parser InstanceSetupData
parseJSON = String
-> (Object -> Parser InstanceSetupData)
-> Value
-> Parser InstanceSetupData
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"InstanceSetupData" ((Object -> Parser InstanceSetupData)
 -> Value -> Parser InstanceSetupData)
-> (Object -> Parser InstanceSetupData)
-> Value
-> Parser InstanceSetupData
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Text
shortDescription <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"short-description"
    Text
cloudInitUserData <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"cloud-init-user-data"
    InstanceSetupData -> Parser InstanceSetupData
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure InstanceSetupData { Text
$sel:shortDescription:InstanceSetupData :: Text
shortDescription :: Text
shortDescription, Text
$sel:cloudInitUserData:InstanceSetupData :: Text
cloudInitUserData :: Text
cloudInitUserData }