packages feed

jacinda-2.0.0.0: src/Include.hs

module Include ( defaultIncludes
               , resolveImport
               ) where

import           Control.Exception  (Exception, throwIO)
import           Control.Monad      (filterM)
import           Data.List.Split    (splitWhen)
import           Data.Maybe         (listToMaybe)
import           Paths_jacinda      (getDataDir)
import           System.Directory   (doesFileExist, getCurrentDirectory)
import           System.Environment (lookupEnv)
import           System.FilePath    ((</>))

data ImportError = FileNotFound !FilePath ![FilePath] deriving (Show)

instance Exception ImportError where

defaultIncludes :: IO ([FilePath] -> [FilePath])
defaultIncludes = do
    path <- jacPath
    d <- getDataDir
    dot <- getCurrentDirectory
    pure $ (dot:).(d:).(++path)

jacPath :: IO [FilePath]
jacPath = maybe [] splitEnv <$> lookupEnv "JAC_PATH"

splitEnv :: String -> [FilePath]
splitEnv = splitWhen (== ':')

resolveImport :: [FilePath] -- ^ Places to look
              -> FilePath
              -> IO FilePath
resolveImport incl fp =
    maybe (throwIO $ FileNotFound fp incl) pure . listToMaybe
        =<< (filterM doesFileExist . fmap (</> fp) $ incl)