packages feed

static-ls-0.1.2: src/StaticLS/FilePath.hs

module StaticLS.FilePath (modToFilePath, subRootExtensionFilepath) where

import Control.Monad.IO.Class
import Control.Monad.Trans.Maybe
import qualified Data.List as List
import qualified Data.List.Extra as List
import qualified GHC.Plugins as GHC
import StaticLS.SrcFiles
import qualified System.Directory as Dir
import System.FilePath ((-<.>), (</>))

modToFilePath :: GHC.ModuleName -> String -> FilePath
modToFilePath modName ext =
    GHC.moduleNameSlashes modName -<.> ext

-- | Substitute a filepath extension and parent directory starting from some root
subRootExtensionFilepath :: (MonadIO m) => FilePath -> FilePath -> String -> FilePath -> MaybeT m FilePath
subRootExtensionFilepath wsRoot parent extension srcPath =
    do
        absoluteRoot <- liftIO $ Dir.makeAbsolute wsRoot
        let absoluteSrcDirs = (absoluteRoot </>) <$> srcDirs
        absoluteSrcPath <- liftIO $ Dir.makeAbsolute srcPath
        -- Normalize to absolute paths to drop the prefix
        let noPrefixSrcPath =
                List.foldl' (flip List.dropPrefix) absoluteSrcPath absoluteSrcDirs
            -- Set the directory path and substitute the file extension
            newPath = absoluteRoot </> parent </> noPrefixSrcPath -<.> extension
        True <- liftIO $ Dir.doesFileExist newPath
        pure newPath