{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE CPP #-}

module Yesod.GitRev.Data where

import GitHash
import Language.Haskell.TH.Syntax (Lift, Q, Exp, unTypeQ)
import Yesod.Core

#if MIN_VERSION_GLASGOW_HASKELL(9,0,0,0)
import Language.Haskell.TH (Code, examineCode)
#else
import Language.Haskell.TH.Syntax(TExp)
#endif

-- | You should not construct one of these yourself.
-- Instead, use gitRev or tGitRev.
-- Fields added to this record are treated as a minor version bump.
data GitRev = GitRev
  { GitRev -> String
gitRevHash :: String
  , GitRev -> String
gitRevBranch :: String
  , GitRev -> Bool
gitRevDirty :: Bool
  , GitRev -> String
gitRevCommitDate :: String
    -- ^ @since 0.2.1
  , GitRev -> Int
gitRevCommitCount :: Int
    -- ^ @since 0.2.1
  , GitRev -> String
gitRevCommitMessage :: String
    -- ^ @since 0.2.1
  }
  deriving GitRev -> Q Exp
GitRev -> Q (TExp GitRev)
(GitRev -> Q Exp) -> (GitRev -> Q (TExp GitRev)) -> Lift GitRev
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: GitRev -> Q (TExp GitRev)
$cliftTyped :: GitRev -> Q (TExp GitRev)
lift :: GitRev -> Q Exp
$clift :: GitRev -> Q Exp
Lift

type TSpliceable a =
#if MIN_VERSION_GLASGOW_HASKELL(9,0,0,0)
  Code Q a
#else
  Q (TExp a)
#endif

mkYesodSubData "GitRev" [parseRoutes|
/ GitRevR GET
|]

-- | A typed splice for creating a GitRev.
-- Example: $$(tGitRev) :: GitRev
tGitRev :: TSpliceable GitRev
tGitRev :: Q (TExp GitRev)
tGitRev = [|| gitRevFromGitInfo $$(tGitInfoCwd) ||]

-- | An untyped splice for creating a GitRev.
-- Example: $(gitRev) :: GitRev
gitRev :: Q Exp
gitRev :: Q Exp
gitRev = Q (TExp GitRev) -> Q Exp
forall a. Q (TExp a) -> Q Exp
unTypeQ (Q (TExp GitRev) -> Q Exp)
-> (Q (TExp GitRev) -> Q (TExp GitRev)) -> Q (TExp GitRev) -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Q (TExp GitRev) -> Q (TExp GitRev)
forall a. a -> a
examine (Q (TExp GitRev) -> Q Exp) -> Q (TExp GitRev) -> Q Exp
forall a b. (a -> b) -> a -> b
$ Q (TExp GitRev)
tGitRev
  where
#if MIN_VERSION_GLASGOW_HASKELL(9,0,0,0)
    examine = examineCode
#else
    examine :: a -> a
examine = a -> a
forall a. a -> a
id
#endif

-- This function is considered to be "internal".
-- Changes to this function will not be accounted for in minor version bumps.
gitRevFromGitInfo :: GitInfo -> GitRev
gitRevFromGitInfo :: GitInfo -> GitRev
gitRevFromGitInfo GitInfo
gi = GitRev :: String -> String -> Bool -> String -> Int -> String -> GitRev
GitRev
  { gitRevHash :: String
gitRevHash = GitInfo -> String
giHash GitInfo
gi
  , gitRevBranch :: String
gitRevBranch = GitInfo -> String
giBranch GitInfo
gi
  , gitRevDirty :: Bool
gitRevDirty = GitInfo -> Bool
giDirty GitInfo
gi
  , gitRevCommitDate :: String
gitRevCommitDate = GitInfo -> String
giCommitDate GitInfo
gi
  , gitRevCommitCount :: Int
gitRevCommitCount = GitInfo -> Int
giCommitCount GitInfo
gi
  , gitRevCommitMessage :: String
gitRevCommitMessage = GitInfo -> String
giCommitMessage GitInfo
gi
  }