yesod-static-remote-0.0.0.0: src/Yesod/EmbeddedStatic/Remote.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Yesod.EmbeddedStatic.Remote
( embedRemoteFileAt
, ensureFile
) where
import Control.Monad
import qualified Data.ByteString.Lazy as LB
import Language.Haskell.TH
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import System.Directory
import System.FilePath
import Yesod.EmbeddedStatic
import Yesod.EmbeddedStatic.Types
-- | Embed a file after downloading it (once, and caching it locally)
embedRemoteFileAt ::
FilePath -- ^ The path to put it (relative)
-> String -- ^ The url to download it from
-> Generator
embedRemoteFileAt fp url = do
runIO $ ensureFile fp url
embedFile fp
ensureFile :: FilePath -> String -> IO ()
ensureFile rp url = do
createDirectoryIfMissing True $ takeDirectory rp
exists <- doesFileExist rp
unless exists $ do
man <- newManager tlsManagerSettings
putStrLn $ unwords ["Downloading", url, "to put it at", rp]
req <- parseUrlThrow url
resp <- httpLbs req man
LB.writeFile rp $ responseBody resp