module HPath.Cabal where
import Prelude hiding (readFile, putStrLn)
import System.IO (stderr, stdin, stdout)
import System.IO.UTF8
import System.FilePath
import Data.List
import Data.Maybe
import Control.Monad
import System.Directory
import Distribution.Verbosity
import Distribution.PackageDescription
import Distribution.PackageDescription.Parse
import Language.Haskell.Extension
info :: FilePath -> IO ([Extension], [FilePath])
info dir = do
cabal <- find
case cabal of
Nothing -> return ([], [])
Just file -> do
s <- readFile file
case parsePackageDescription s of
ParseFailed err -> do
hPutStrLn stderr ("Cabal error:" ++ "\n" ++ show err)
return ([], [])
ParseOk warns gpkg -> do
when ((not . null) warns) $ do
hPutStrLn stderr (unlines ("Cabal warnings:" : fmap show warns))
return (extensions_and_sources gpkg)
where
find = one_cabal `fmap` getDirectoryContents dir
where
one_cabal = listToMaybe . filter (isSuffixOf ".cabal")
extensions_and_sources gpkg = concatP joined
where
joined = [lib] ++ exes ++ [([], [dir])]
exes = exe `fmap` condExecutables gpkg
exe = build_read . buildInfo . condTreeData . snd
lib = case condLibrary gpkg of
Nothing -> ([], [])
Just condTree -> (build_read . libBuildInfo . condTreeData) condTree
concatP pairs = (concatMap fst pairs, concatMap snd pairs)
build_read bi = (extensions bi, hsSourceDirs bi)