{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Util.EmbedAsUrl
( embedAsUrl,
)
where
import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as B64
import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString.Unsafe as B
import qualified Data.Text.Encoding as T
import Language.Haskell.TH.Syntax
import System.IO.Unsafe
embedAsUrl :: String -> FilePath -> Q Exp
embedAsUrl :: String -> String -> Q Exp
embedAsUrl String
contentType String
f = do
forall (m :: * -> *). Quasi m => String -> m ()
qAddDependentFile String
f
ByteString
payload <- forall a. IO a -> Q a
runIO forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
B64.encode forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO ByteString
B.readFile String
f
let uri :: ByteString
uri = ByteString
"data:" forall a. Semigroup a => a -> a -> a
<> String -> ByteString
BC.pack String
contentType forall a. Semigroup a => a -> a -> a
<> ByteString
";base64," forall a. Semigroup a => a -> a -> a
<> ByteString
payload
[e|
T.decodeUtf8 $ unsafePerformIO $
B.unsafePackAddressLen
$(return $ LitE $ IntegerL $ fromIntegral $ B.length uri)
$(return $ LitE $ StringPrimL $ B.unpack uri)
|]