56 lines
1.9 KiB
Haskell
56 lines
1.9 KiB
Haskell
module CabalApi (
|
|
cabalParseFile,
|
|
cabalBuildInfo,
|
|
cabalDependPackages
|
|
) where
|
|
|
|
import Control.Applicative
|
|
|
|
import Data.Maybe (fromJust, maybeToList)
|
|
import Data.Set (fromList, toList)
|
|
|
|
import Distribution.Verbosity (silent)
|
|
import Distribution.Package (Dependency(Dependency), PackageName(PackageName))
|
|
import Distribution.PackageDescription
|
|
(GenericPackageDescription,
|
|
condLibrary, condExecutables, condTestSuites, condBenchmarks,
|
|
BuildInfo, libBuildInfo, buildInfo,
|
|
CondTree, condTreeConstraints, condTreeData)
|
|
import Distribution.PackageDescription.Parse (readPackageDescription)
|
|
|
|
----------------------------------------------------------------
|
|
|
|
cabalParseFile :: FilePath -> IO GenericPackageDescription
|
|
cabalParseFile = readPackageDescription silent
|
|
|
|
-- Causes error, catched in the upper function.
|
|
cabalBuildInfo :: GenericPackageDescription -> IO BuildInfo
|
|
cabalBuildInfo pd =
|
|
return . fromJust $ fromLibrary pd <|> fromExecutable pd
|
|
where
|
|
fromLibrary c = libBuildInfo . condTreeData <$> condLibrary c
|
|
fromExecutable c = buildInfo . condTreeData . snd <$> toMaybe (condExecutables c)
|
|
toMaybe [] = Nothing
|
|
toMaybe (x:_) = Just x
|
|
|
|
getDepsOfPairs :: [(a1, CondTree v [b] a)] -> [b]
|
|
getDepsOfPairs = concatMap (condTreeConstraints . snd)
|
|
|
|
allDependsOfDescription :: GenericPackageDescription -> [Dependency]
|
|
allDependsOfDescription pd =
|
|
concat [depLib, depExe, depTests, depBench]
|
|
where
|
|
depLib = concatMap condTreeConstraints (maybeToList . condLibrary $ pd)
|
|
depExe = getDepsOfPairs . condExecutables $ pd
|
|
depTests = getDepsOfPairs . condTestSuites $ pd
|
|
depBench = getDepsOfPairs . condBenchmarks $ pd
|
|
|
|
getDependencyPackageName :: Dependency -> String
|
|
getDependencyPackageName (Dependency (PackageName n) _) = n
|
|
|
|
cabalDependPackages :: GenericPackageDescription -> IO [String]
|
|
cabalDependPackages =
|
|
return . toList . fromList
|
|
. map getDependencyPackageName
|
|
. allDependsOfDescription
|