module Language.PureScript.Publish.Utils where

import Data.List
import Data.Either (partitionEithers)
import System.Directory
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
import System.FilePath (pathSeparator)
import qualified System.FilePath.Glob as Glob

-- | Glob relative to the current directory, and produce relative pathnames.
globRelative :: Glob.Pattern -> IO [FilePath]
globRelative pat = do
  currentDir <- getCurrentDirectory
  filesAbsolute <- Glob.globDir1 pat currentDir
  let prefix = currentDir ++ [pathSeparator]
  let (fails, paths) = partitionEithers . map (stripPrefix' prefix) $ filesAbsolute
  if null fails
    then return paths
    else do
      let p = hPutStrLn stderr
      p "Internal error in Language.PureScript.Publish.Utils.globRelative"
      p "Unmatched files:"
      mapM_ p fails
      exitFailure

  where
  stripPrefix' prefix dir =
    maybe (Left dir) Right $ stripPrefix prefix dir

-- | Glob pattern for PureScript source files.
purescriptSourceFiles :: Glob.Pattern
purescriptSourceFiles = Glob.compile "src/**/*.purs"

-- | Glob pattern for PureScript dependency files.
purescriptDepsFiles :: Glob.Pattern
purescriptDepsFiles = Glob.compile "bower_components/*/src/**/*.purs"