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