{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}
module Data.HCL.Types where

import           Control.DeepSeq     (NFData)
import           Data.HashMap.Strict (HashMap)
import           Data.Scientific     (Scientific)
import           Data.Text           (Text)
import           GHC.Generics        (Generic)

-- | The HCL document is just a list of statements
type HCLDoc = [HCLStatement]

-- | Statements may be "objects", of form:
--
-- @
-- provider "aws" {
-- # more
-- }
-- @
--
-- Or they may be assignments:
--
-- @
-- a = "b"
-- @
data HCLStatement = HCLStatementObject HCLValue
                  | HCLStatementAssignment ([Text], HCLValue)
  deriving(Generic, Show, Eq, NFData)

data HCLValue = HCLNumber Scientific
              | HCLString [HCLStringPart]
              | HCLIdent Text
              | HCLObject [Text] (HashMap [Text] HCLValue)
              | HCLList [HCLValue]
  deriving(Generic, Show, Eq, NFData)

type HCLList = [HCLValue]

data HCLStringPart = HCLStringPlain Text
                   | HCLStringInterp Text
  deriving(Generic, Show, Eq, NFData)