@@ -18,6 +18,7 @@
18module Data.FileEmbed
18module Data.FileEmbed
19 ( -- * Embed at compile time
19 ( -- * Embed at compile time
21 , embedDir
22 , embedDir
23 -- * Inject into an executable
24 -- * Inject into an executable
@@ -45,6 +46,7 @@ import Language.Haskell.TH.Syntax
46import System.Directory (doesDirectoryExist, doesFileExist,
47import System.Directory (doesDirectoryExist, doesFileExist,
47 getDirectoryContents)
48 getDirectoryContents)
49+import Control.Exception (throw, ErrorCall(..))
48import Control.Monad (filterM)
50import Control.Monad (filterM)
49import qualified Data.ByteString as B
51import qualified Data.ByteString as B
50import qualified Data.ByteString.Char8 as B8
52import qualified Data.ByteString.Char8 as B8
@@ -67,6 +69,28 @@ embedFile fp =
68 (runIO $ B.readFile fp) >>= bsToExp
70 (runIO $ B.readFile fp) >>= bsToExp
72+-- | Embed a single existing file in your source code
73+-- out of list a list of paths supplied.
75+-- > import qualified Data.ByteString
77+-- > myFile :: Data.ByteString.ByteString
78+-- > myFile = $(embedFile' [ "dirName/fileName", "src/dirName/fileName" ])
79+embedFile' :: [FilePath] -> Q Exp
81+ (runIO $ readExistingFile ps) >>= \ ( path, content ) -> do
82+#if MIN_VERSION_template_haskell(2,7,0)
83+ qAddDependentFile path
87+ readExistingFile :: [FilePath] -> IO ( FilePath, B.ByteString )
88+ readExistingFile xs = do
89+ ys <- filterM doesFileExist xs
91+ (p:_) -> B.readFile p >>= \ c -> return ( p, c )
92+ _ -> throw $ ErrorCall "Cannot find file to embed as resource"
70-- | Embed a directory recursively in your source code.
94-- | Embed a directory recursively in your source code.
72-- > import qualified Data.ByteString
96-- > import qualified Data.ByteString