git.iko.soy/typeable/file-embed
on master help sign in
3 files changed+20−5
since splitsnapshots
unifiedsplit
ChangeLog.md+4 Data/FileEmbed.hs+15−4 file-embed.cabal+1−1
ChangeLog.md+4
@@ -1,5 +1,9 @@
11# ChangeLog for file-embed
22
3+## 0.0.15.0
4+
5+* Add `makeRelativeToLocationPredicate`
6+
37## 0.0.14.0
48
59* Add `embedFileIfExists`
Data/FileEmbed.hs+15−4
@@ -39,6 +39,7 @@ module Data.FileEmbed
3939 , injectFileWith
4040 -- * Relative path manipulation
4141 , makeRelativeToProject
42+ , makeRelativeToLocationPredicate
4243 -- * Internal
4344 , stringToBs
4445 , bsToExp
@@ -408,7 +409,19 @@ available, you can use the non-@With@ variants.
408409--
409410-- @since 0.0.10
410411makeRelativeToProject :: FilePath -> Q FilePath
411−makeRelativeToProject rel = do
412+makeRelativeToProject = makeRelativeToLocationPredicate $ (==) ".cabal" . takeExtension
413+
414+-- | Take a predicate to infer the project root and a relative file path, the given file path is then attached to the inferred project root
415+--
416+-- This function looks at the source location of the Haskell file calling it,
417+-- finds the first parent directory with a file matching the given predicate, and uses that as the
418+-- root directory for fixing the relative path.
419+--
420+-- @$(makeRelativeToLocationPredicate ((==) ".cabal" . takeExtension) "data/foo.txt" >>= embedFile)@
421+--
422+-- @since 0.0.15.0
423+makeRelativeToLocationPredicate :: (FilePath -> Bool) -> FilePath -> Q FilePath
424+makeRelativeToLocationPredicate isTargetFile rel = do
412425 loc <- qLocation
413426 runIO $ do
414427 srcFP <- canonicalizePath $ loc_filename loc
@@ -423,8 +436,6 @@ makeRelativeToProject rel = do
423436 then return Nothing
424437 else do
425438 contents <- getDirectoryContents dir
426− if any isCabalFile contents
439+ if any isTargetFile contents
427440 then return (Just dir)
428441 else findProjectDir dir
429−
430− isCabalFile fp = takeExtension fp == ".cabal"
file-embed.cabal+1−1
@@ -1,5 +1,5 @@
11name: file-embed
2−version: 0.0.14.0
2+version: 0.0.15.0
33license: BSD2
44license-file: LICENSE
55author: Michael Snoyman <michael@snoyman.com>