module Distribution.PackageDescription.TH (
packageVariable,
packageVariableFrom,
packageString,
PackageDescription(..),
PackageIdentifier(..),
Version(..)
) where
import Distribution.PackageDescription
import Distribution.Package
import Distribution.Version
import Distribution.Text
import Distribution.Compat.ReadP
import Distribution.Verbosity (silent)
import Text.PrettyPrint
import Distribution.PackageDescription.Parse (readPackageDescription)
import System.Directory (getCurrentDirectory, getDirectoryContents)
import Data.List (isSuffixOf)
import Language.Haskell.TH (Q, Exp, stringE, runIO)
newtype DocString = DocString String
instance Text DocString where
parse = DocString <$> (readS_to_P read)
disp (DocString s) = text s
packageString :: String -> DocString
packageString = DocString
packageVariable :: Text a => (PackageDescription -> a) -> Q Exp
packageVariable = renderField currentPackageDescription
packageVariableFrom :: Text a => FilePath -> (PackageDescription -> a) -> Q Exp
packageVariableFrom s = renderField $ fmap packageDescription (readPackageDescription silent s)
renderField :: Text b => IO a -> (a -> b) -> Q Exp
renderField pd f = renderFieldS pd (display . f)
renderFieldS :: IO a -> (a -> String) -> Q Exp
renderFieldS pd f = runIO pd >>= stringE . f
currentPackageDescription :: IO PackageDescription
currentPackageDescription = fmap packageDescription $ do
dir <- getCurrentDirectory
cs <- cabalFiles dir
case cs of
(c:_) -> readPackageDescription silent c
[] -> error $ "Couldn't find a cabal file in the current working directory (" ++ dir ++ ")"
cabalFiles :: FilePath -> IO [FilePath]
cabalFiles dir = do
files <- getDirectoryContents dir
return $ filter (".cabal" `isSuffixOf`) files