{-|
Defines the template types used internally in ProjectForge
-}
module ProjectForge.ProjectTemplate where

import           Data.Set      (Set)
import           Text.Mustache (Template)

{-|
A @FileTemplate@ is a pair of @'Text.Mustache.Template'@s:
one for a file's name and
one for a file's contents.

See @'ProjectForge.Compile.compileFileTemplate`@ for a utility
to create a @FileTemplate@ from text inputs.
-}
data FileTemplate = MkFileTemplate {
    FileTemplate -> FilePath
originalFilename     :: !FilePath -- ^ name of the template file
  , FileTemplate -> Template
fileNameTemplate     :: !Template -- ^ template for a file's name
  , FileTemplate -> Template
fileContentsTemplate :: !Template -- ^ template for contents of a file
  } deriving (FileTemplate -> FileTemplate -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FileTemplate -> FileTemplate -> Bool
$c/= :: FileTemplate -> FileTemplate -> Bool
== :: FileTemplate -> FileTemplate -> Bool
$c== :: FileTemplate -> FileTemplate -> Bool
Eq, Int -> FileTemplate -> ShowS
[FileTemplate] -> ShowS
FileTemplate -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [FileTemplate] -> ShowS
$cshowList :: [FileTemplate] -> ShowS
show :: FileTemplate -> FilePath
$cshow :: FileTemplate -> FilePath
showsPrec :: Int -> FileTemplate -> ShowS
$cshowsPrec :: Int -> FileTemplate -> ShowS
Show, Eq FileTemplate
FileTemplate -> FileTemplate -> Bool
FileTemplate -> FileTemplate -> Ordering
FileTemplate -> FileTemplate -> FileTemplate
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FileTemplate -> FileTemplate -> FileTemplate
$cmin :: FileTemplate -> FileTemplate -> FileTemplate
max :: FileTemplate -> FileTemplate -> FileTemplate
$cmax :: FileTemplate -> FileTemplate -> FileTemplate
>= :: FileTemplate -> FileTemplate -> Bool
$c>= :: FileTemplate -> FileTemplate -> Bool
> :: FileTemplate -> FileTemplate -> Bool
$c> :: FileTemplate -> FileTemplate -> Bool
<= :: FileTemplate -> FileTemplate -> Bool
$c<= :: FileTemplate -> FileTemplate -> Bool
< :: FileTemplate -> FileTemplate -> Bool
$c< :: FileTemplate -> FileTemplate -> Bool
compare :: FileTemplate -> FileTemplate -> Ordering
$ccompare :: FileTemplate -> FileTemplate -> Ordering
Ord)

{-|
A collection of @'FileTemplate'@ corresponding to all the files
to be produced by an initialization template.
-}
newtype ProjectTemplate = MkProjectTemplate (Set FileTemplate)
  deriving (ProjectTemplate -> ProjectTemplate -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ProjectTemplate -> ProjectTemplate -> Bool
$c/= :: ProjectTemplate -> ProjectTemplate -> Bool
== :: ProjectTemplate -> ProjectTemplate -> Bool
$c== :: ProjectTemplate -> ProjectTemplate -> Bool
Eq, Int -> ProjectTemplate -> ShowS
[ProjectTemplate] -> ShowS
ProjectTemplate -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [ProjectTemplate] -> ShowS
$cshowList :: [ProjectTemplate] -> ShowS
show :: ProjectTemplate -> FilePath
$cshow :: ProjectTemplate -> FilePath
showsPrec :: Int -> ProjectTemplate -> ShowS
$cshowsPrec :: Int -> ProjectTemplate -> ShowS
Show)

instance Semigroup ProjectTemplate where
  <> :: ProjectTemplate -> ProjectTemplate -> ProjectTemplate
(<>) (MkProjectTemplate Set FileTemplate
x) (MkProjectTemplate Set FileTemplate
y) = Set FileTemplate -> ProjectTemplate
MkProjectTemplate (Set FileTemplate
x forall a. Semigroup a => a -> a -> a
<> Set FileTemplate
y)