module Development.HgRev.TH where

import           Data.Maybe          (fromMaybe)
import           Data.Monoid         ((<>))
import           Development.HgRev   (HgRev (..), HgState (..), hgRevState)
import           Language.Haskell.TH (ExpQ, runIO, stringE)
import           System.Directory    (getCurrentDirectory)


hgRevStateTH :: (HgRev -> HgState -> String) -> ExpQ
hgRevStateTH format = do
    revState <- runIO $ hgRevState =<< getCurrentDirectory
    stringE $ "hg rev: " <> maybe "UNKNOWN" (uncurry format) revState


defFormat :: HgRev -> HgState -> String
defFormat rev state =
    "\n\t long: " <> hgRevision rev
    <> "\n\t short: " <> take 12 (hgRevision rev)
    <> "\n\t dirty: " <> dirty state
  where
    dirty Clean = "false"
    dirty Dirty = "true"