module System.FilePath.TH where
import Prelude
import Control.Monad ((<=<))
import Data.FileEmbed (makeRelativeToProject)
import Language.Haskell.TH (Loc(Loc), Exp, Q, loc_filename, location, runIO, stringE)
import System.Directory (canonicalizePath, getCurrentDirectory)
import System.FilePath ((</>), takeDirectory)
fileRelativeToAbsolute :: String -> Q Exp
fileRelativeToAbsolute = stringE <=< fileRelativeToAbsoluteStr
fileRelativeToAbsoluteStr :: String -> Q String
fileRelativeToAbsoluteStr absoluteFilePath@('/':_) =
runIO . canonicalizePath $ absoluteFilePath
fileRelativeToAbsoluteStr relativeFilePath = do
Loc {..} <- location
currentDir <- runIO getCurrentDirectory
let baseDir = takeDirectory loc_filename
runIO $ canonicalizePath $ currentDir </> baseDir </> relativeFilePath
fileRelativeToProject :: FilePath -> Q Exp
fileRelativeToProject = stringE <=< makeRelativeToProject