module Importify.Cabal.Package
( extractFromTargets
, packageDependencies
, readCabal
) where
import Universum hiding (fromString)
import Distribution.Package (Dependency (..), unPackageName)
import Distribution.PackageDescription (Benchmark (benchmarkBuildInfo),
BuildInfo (..), CondTree,
Executable (..),
GenericPackageDescription (..),
Library (..),
TestSuite (testBuildInfo),
condTreeData)
import Distribution.PackageDescription.Parse (readPackageDescription)
import Distribution.Verbosity (normal)
readCabal :: MonadIO m => FilePath -> m GenericPackageDescription
readCabal = liftIO . readPackageDescription normal
dependencyName :: Dependency -> String
dependencyName (Dependency name _) = unPackageName name
packageDependencies :: GenericPackageDescription -> [String]
packageDependencies = ordNub
. concatMap (map dependencyName . targetBuildDepends)
. allBuildInfos
allBuildInfos :: GenericPackageDescription -> [BuildInfo]
allBuildInfos = extractFromTargets libBuildInfo
buildInfo
testBuildInfo
benchmarkBuildInfo
extractFromTargets :: (Library -> r)
-> (Executable -> r)
-> (TestSuite -> r)
-> (Benchmark -> r)
-> GenericPackageDescription
-> [r]
extractFromTargets fromLib fromExe fromTst fromBnc GenericPackageDescription{..} =
concat
[ maybe [] (one . fromLib . condTreeData) condLibrary
, mapTargets fromExe condExecutables
, mapTargets fromTst condTestSuites
, mapTargets fromBnc condBenchmarks
]
mapTargets :: (t -> r) -> [(s, CondTree v c t)] -> [r]
mapTargets extractor = map (extractor . condTreeData . snd)