1 {-# LANGUAGE OverloadedStrings #-} 2 module Databrary.Web.Files 3 ( allWebFiles 4 , findWebFiles 5 ) where 6 7 import Control.Exception (bracket) 8 import Control.Monad (ap) 9 import qualified Data.ByteString as BS 10 import qualified Data.ByteString.Char8 as BSC 11 import System.Posix.Directory.ByteString (openDirStream, closeDirStream) 12 import System.Posix.Directory.Foreign (dtDir, dtReg) 13 import System.Posix.Directory.Traversals (readDirEnt) 14 import System.Posix.FilePath (takeExtensions) 15 16 import Databrary.Files 17 import Databrary.Web 18 19 listFiles :: RawFilePath -> IO [RawFilePath] 20 listFiles dir = loop "" where 21 loop b = bracket 22 (openDirStream (dir </> b)) 23 closeDirStream 24 (ent b) 25 ent b dh = do 26 (t, f) <- readDirEnt dh 27 if BS.null f 28 then return [] 29 else ap 30 (if BSC.head f == '.' 31 then return id 32 else if t == dtDir 33 then (++) <$> loop (b </> f) 34 else if t == dtReg 35 then return $ (:) (b </> f) 36 else return id) 37 (ent b dh) 38 39 allWebFiles :: IO [WebFilePath] 40 allWebFiles = withWebDir $ \webDirRaw -> mapM makeWebFilePath =<< listFiles webDirRaw 41 42 findWebFiles :: BS.ByteString -> IO [WebFilePath] 43 findWebFiles ext = filter ((ext ==) . takeExtensions . webFileRel) <$> allWebFiles