@@ -14,7 +14,9 @@ module Stack.GhcPkg
1414 ,envHelper
1515 ,createDatabase
1616 ,unregisterGhcPkgId
17- ,getCabalPkgVer )
17+ ,getCabalPkgVer
18+ ,findGhcPkgHaddockHtml
19+ ,findGhcPkgDepends )
1820 where
1921
2022import Control.Monad
@@ -26,6 +28,7 @@ import qualified Data.ByteString.Char8 as S8
2628import Data.Either
2729import Data.List
2830import Data.Maybe
31+ import Data.Text (Text )
2932import qualified Data.Text as T
3033import qualified Data.Text.Encoding as T
3134import Path (Path , Abs , Dir , toFilePath , parent , parseAbsDir )
@@ -90,35 +93,61 @@ packageDbFlags pkgDbs =
9093 " --no-user-package-db"
9194 : map (\ x -> (" --package-db=" ++ toFilePath x)) pkgDbs
9295
96+ -- | Get the value of a field of the package.
97+ findGhcPkgField :: (MonadIO m , MonadLogger m , MonadBaseControl IO m , MonadCatch m , MonadThrow m )
98+ => EnvOverride
99+ -> [Path Abs Dir ] -- ^ package databases
100+ -> Text
101+ -> Text
102+ -> m (Maybe Text )
103+ findGhcPkgField menv pkgDbs name field = do
104+ result <- ghcPkg menv pkgDbs [" field" , T. unpack name, T. unpack field]
105+ return $ case result of
106+ Left {} -> Nothing
107+ Right lbs ->
108+ case map (stripCR . T. decodeUtf8) (S8. lines lbs) of
109+ [] -> Nothing
110+ (line: lines_) ->
111+ case T. stripPrefix (T. append field " : " ) line of
112+ Nothing -> Nothing
113+ Just line' -> Just $ T. intercalate " \n " (line': lines_)
114+ where stripCR t = fromMaybe t (T. stripSuffix " \r " t)
115+
93116-- | Get the id of the package e.g. @foo-0.0.0-9c293923c0685761dcff6f8c3ad8f8ec@.
94117findGhcPkgId :: (MonadIO m , MonadLogger m , MonadBaseControl IO m , MonadCatch m , MonadThrow m )
95118 => EnvOverride
96119 -> [Path Abs Dir ] -- ^ package databases
97120 -> PackageName
98121 -> m (Maybe GhcPkgId )
99122findGhcPkgId menv pkgDbs name = do
100- result <-
101- ghcPkg menv pkgDbs [" describe" , packageNameString name]
102- case result of
103- Left {} ->
104- return Nothing
105- Right lbs -> do
106- let mpid =
107- fmap
108- T. encodeUtf8
109- (listToMaybe
110- (mapMaybe
111- (fmap stripCR .
112- T. stripPrefix " id: " )
113- (map T. decodeUtf8 (S8. lines lbs))))
114- case mpid of
115- Just ! pid ->
116- return (parseGhcPkgId pid)
117- _ ->
118- return Nothing
119- where
120- stripCR t =
121- fromMaybe t (T. stripSuffix " \r " t)
123+ mpid <- findGhcPkgField menv pkgDbs (packageNameText name) " id"
124+ case mpid of
125+ Just ! pid -> return (parseGhcPkgId (T. encodeUtf8 pid))
126+ _ -> return Nothing
127+
128+ -- | Get the Haddock HTML documentation path of the package.
129+ findGhcPkgHaddockHtml :: (MonadIO m , MonadLogger m , MonadBaseControl IO m , MonadCatch m , MonadThrow m )
130+ => EnvOverride
131+ -> [Path Abs Dir ] -- ^ package databases
132+ -> PackageIdentifier
133+ -> m (Maybe (Path Abs Dir ))
134+ findGhcPkgHaddockHtml menv pkgDbs pkgId = do
135+ mpath <- findGhcPkgField menv pkgDbs (packageIdentifierText pkgId) " haddock-html"
136+ case mpath of
137+ Just ! path -> return (parseAbsDir (T. unpack path))
138+ _ -> return Nothing
139+
140+ -- | Get the dependencies of the package.
141+ findGhcPkgDepends :: (MonadIO m , MonadLogger m , MonadBaseControl IO m , MonadCatch m , MonadThrow m )
142+ => EnvOverride
143+ -> [Path Abs Dir ] -- ^ package databases
144+ -> PackageIdentifier
145+ -> m [GhcPkgId ]
146+ findGhcPkgDepends menv pkgDbs pkgId = do
147+ mdeps <- findGhcPkgField menv pkgDbs (packageIdentifierText pkgId) " depends"
148+ case mdeps of
149+ Just ! deps -> return (mapMaybe (parseGhcPkgId . T. encodeUtf8) (T. words deps))
150+ _ -> return []
122151
123152unregisterGhcPkgId :: (MonadIO m , MonadLogger m , MonadThrow m , MonadCatch m , MonadBaseControl IO m )
124153 => EnvOverride
0 commit comments