super-user-spark-0.4.0.0: src/SuperUserSpark/Language/Types.hs
{-# LANGUAGE DeriveGeneric #-}
module SuperUserSpark.Language.Types where
import Import
import SuperUserSpark.CoreTypes
-- * Cards
type CardName = String
type Source = FilePath
type Destination = FilePath
data Card = Card
{ cardName :: CardName
, cardContent :: Declaration
} deriving (Show, Eq, Generic)
instance Validity Card
-- ** Declarations
-- | A declaration in a card
data Declaration
= SparkOff CardReference -- ^ Spark off another card
| Deploy Source
Destination
(Maybe DeploymentKind) -- ^ Deploy from source to destination
| IntoDir Directory -- ^ Deploy into a directory
| OutofDir Directory -- ^ Deploy outof a directory
| DeployKindOverride DeploymentKind -- ^ Override the deployment kind
| Alternatives [Directory] -- ^ Provide a list of alternative sources
| Block [Declaration] -- ^ A scoped block of declarations
deriving (Show, Eq, Generic)
instance Validity Declaration
-- * Card references
-- | Reference a card by name (inside a file)
newtype CardNameReference =
CardNameReference CardName
deriving (Show, Eq, Generic)
instance Validity CardNameReference
-- | Reference a card by the file it is in and therein potentially by a name reference
data CardFileReference =
CardFileReference FilePath
(Maybe CardNameReference)
deriving (Show, Eq, Generic)
instance Validity CardFileReference
instance Read CardFileReference where
readsPrec _ fp =
case length (words fp) of
1 -> [(CardFileReference fp Nothing, "")]
2 ->
let [f, c] = words fp
in [(CardFileReference f (Just $ CardNameReference c), "")]
_ -> []
-- | Union card reference
data CardReference
= CardFile CardFileReference
| CardName CardNameReference
deriving (Show, Eq, Generic)
instance Validity CardReference
-- * Card files
data SparkFile = SparkFile
{ sparkFilePath :: Path Abs File
, sparkFileCards :: [Card]
} deriving (Show, Eq, Generic)
instance Validity SparkFile