module Shpadoinkle.Html.TH.AssetLink where
import Control.Monad (unless)
import Language.Haskell.TH.Syntax (Exp (LitE), Lit (StringL), Q,
runIO)
import Prelude hiding (readFile)
import System.Directory (doesFileExist)
import System.Exit (ExitCode (..))
import System.Process (readProcessWithExitCode)
assetLink :: FilePath -> Q Exp
assetLink = assetLinkWithBase ""
assetLinkWithBase :: FilePath -> FilePath -> Q Exp
assetLinkWithBase base fp' = runIO $ do
let fp = base <> fp'
exists <- doesFileExist $ "." <> fp
unless exists . fail $ "No asset found at " <> fp
out@(exit, hash, _) <- readProcessWithExitCode "sha1sum" ["." <> fp] ""
case exit of
ExitSuccess -> return . LitE . StringL $ fp <> "?_=" <> take 20 hash
ExitFailure _ -> fail $ show out