git.iko.soy/typeable/file-embed
on master help sign in
added 'embedFileIfExists'
4a280eeCharlie Durham
Data/FileEmbed.hs+24−2
@@ -19,6 +19,7 @@
19module Data.FileEmbed
19module Data.FileEmbed
20 ( -- * Embed at compile time
20 ( -- * Embed at compile time
21 embedFile
21 embedFile
22+ , embedFileIfExists
22 , embedOneFileOf
23 , embedOneFileOf
23 , embedDir
24 , embedDir
24 , embedDirListing
25 , embedDirListing
@@ -60,13 +61,14 @@ import qualified Data.ByteString.Internal as B
60#endif
61#endif
61import System.Directory (doesDirectoryExist, doesFileExist,
62import System.Directory (doesDirectoryExist, doesFileExist,
62 getDirectoryContents, canonicalizePath)
63 getDirectoryContents, canonicalizePath)
63−import Control.Exception (throw, ErrorCall(..))
64+import Control.Exception (throw, tryJust, ErrorCall(..))
64−import Control.Monad (filterM)
65+import Control.Monad (filterM, guard)
65import qualified Data.ByteString as B
66import qualified Data.ByteString as B
66import qualified Data.ByteString.Char8 as B8
67import qualified Data.ByteString.Char8 as B8
67import Control.Arrow ((&&&), second)
68import Control.Arrow ((&&&), second)
68import Control.Applicative ((<$>))
69import Control.Applicative ((<$>))
69import Data.ByteString.Unsafe (unsafePackAddressLen)
70import Data.ByteString.Unsafe (unsafePackAddressLen)
71+import System.IO.Error (isDoesNotExistError)
70import System.IO.Unsafe (unsafePerformIO)
72import System.IO.Unsafe (unsafePerformIO)
71import System.FilePath ((</>), takeDirectory, takeExtension)
73import System.FilePath ((</>), takeDirectory, takeExtension)
72import Data.String (fromString)
74import Data.String (fromString)
@@ -87,6 +89,26 @@ embedFile fp =
87#endif
89#endif
88 (runIO $ B.readFile fp) >>= bsToExp
90 (runIO $ B.readFile fp) >>= bsToExp
89
91
92+-- | Maybe embed a single file in your source code depending on whether or not file exists.
93+--
94+-- Warning: Does not use `qAddDependentFile` to force a recompile depending on changes to or appearance of the file.
95+--
96+-- > import qualified Data.ByteString
97+-- >
98+-- > maybeMyFile :: Maybe Data.ByteString.ByteString
99+-- > maybeMyFile = $(embedFileIfExists "dirName/fileName")
100+embedFileIfExists :: FilePath -> Q Exp
101+embedFileIfExists fp = runIO maybeFile >>= maybeBsToExp
102+ where
103+ maybeFile :: IO (Maybe B.ByteString)
104+ maybeFile =
105+ either (const Nothing) Just <$>
106+ tryJust (guard . isDoesNotExistError) (B.readFile fp)
107+
108+ maybeBsToExp :: Maybe B.ByteString -> Q Exp
109+ maybeBsToExp Nothing = [| Nothing |]
110+ maybeBsToExp (Just bs) = [| Just $(bsToExp bs) |]
111+
90-- | Embed a single existing file in your source code
112-- | Embed a single existing file in your source code
91-- out of list a list of paths supplied.
113-- out of list a list of paths supplied.
92--
114--