git.iko.soy/typeable/file-embed
on master help sign in
Embed existing file out of paths supplied
1cabbcfRoman Kuznetsov
Data/FileEmbed.hs+24
@@ -18,6 +18,7 @@
18module Data.FileEmbed
18module Data.FileEmbed
19 ( -- * Embed at compile time
19 ( -- * Embed at compile time
20 embedFile
20 embedFile
21+ , embedFile'
21 , embedDir
22 , embedDir
22 , getDir
23 , getDir
23 -- * Inject into an executable
24 -- * Inject into an executable
@@ -45,6 +46,7 @@ import Language.Haskell.TH.Syntax
45 )
46 )
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 =
67#endif
69#endif
68 (runIO $ B.readFile fp) >>= bsToExp
70 (runIO $ B.readFile fp) >>= bsToExp
69
71
72+-- | Embed a single existing file in your source code
73+-- out of list a list of paths supplied.
74+--
75+-- > import qualified Data.ByteString
76+-- >
77+-- > myFile :: Data.ByteString.ByteString
78+-- > myFile = $(embedFile' [ "dirName/fileName", "src/dirName/fileName" ])
79+embedFile' :: [FilePath] -> Q Exp
80+embedFile' ps =
81+ (runIO $ readExistingFile ps) >>= \ ( path, content ) -> do
82+#if MIN_VERSION_template_haskell(2,7,0)
83+ qAddDependentFile path
84+#endif
85+ bsToExp content
86+ where
87+ readExistingFile :: [FilePath] -> IO ( FilePath, B.ByteString )
88+ readExistingFile xs = do
89+ ys <- filterM doesFileExist xs
90+ case ys of
91+ (p:_) -> B.readFile p >>= \ c -> return ( p, c )
92+ _ -> throw $ ErrorCall "Cannot find file to embed as resource"
93+
70-- | Embed a directory recursively in your source code.
94-- | Embed a directory recursively in your source code.
71--
95--
72-- > import qualified Data.ByteString
96-- > import qualified Data.ByteString