packages feed

sandman-0.1.0.0: Sandman/PackageDb.hs

module Sandman.PackageDb (
      PackageDb
    , packageDbRoot
    , packageDbInstalledPackages
    , getPackageDb
    ) where

import Control.Applicative
import Data.Either
import Data.List           (isSuffixOf)
import System.Directory    (doesDirectoryExist)

import Sandman.InstalledPackage (InstalledPackage, getInstalledPackage)
import Sandman.Util

-- | Represents a Cabal package database.
data PackageDb = PackageDb {
    packageDbRoot              :: FilePath
  -- ^ Root directory of the package database.
  , packageDbInstalledPackages :: [InstalledPackage]
  -- ^ List of packages installed inside the database.
  }

-- | Get the package database for the given root directory.
getPackageDb :: FilePath -> IO (Either String PackageDb)
getPackageDb root = doesDirectoryExist root >>= \exists ->
  if not exists
    then return $ Left (root ++ " is not a package DB")
    else getPackageDb_ root

getPackageDb_ :: FilePath -> IO (Either String PackageDb)
getPackageDb_ root = do
    confFiles <- listDirectory root <&> filter (".conf" `isSuffixOf`)
    result <- partitionEithers <$> mapM getInstalledPackage confFiles
    return $ case result of
      ([], installedPackages) -> Right $
          PackageDb root installedPackages
      (errs, _) -> Left . unlines $
          ("Failed to read package DB at " ++ root) : errs