-- | Haskell helper program for dealing with Cabal ports.
-- The Cabal package file format is pretty complicated, so the most robust way
-- to deal with it is to use Cabal itself to parse it.

module HsPortHelper where

import Control.Monad
import Data.List
import Data.Version
import Distribution.Package
import Distribution.PackageDescription
import Distribution.PackageDescription.Configuration
import Distribution.PackageDescription.Parse
import qualified Distribution.Verbosity as V
import System.Environment

printClean :: String -> IO ()
printClean s = putStrLn [c | c <- s, c /= '\r', c /= '\n']

main :: IO ()
main
   = do args <- getArgs
        when (length args /= 1) $
          error "Usage: HsPortHelper CABAL-FILE"
        let [cabalFile] = args

        -- Parse the Cabal file.
        gp <- readPackageDescription V.normal cabalFile
        let p = flattenPackageDescription gp

        -- Print version.
        printClean $ showVersion $ pkgVersion $ package p

        -- Print synopsis.
        printClean $ synopsis p

        -- Print home URL.
        printClean $ homepage p

        -- Print library dependencies.
        let packages = [s | Dependency (PackageName s) _ <- buildDepends p]
        printClean $ concat $ intersperse " " packages

        -- Print build dependencies.
        let allTools = concat [buildTools bi | bi <- allBuildInfo p]
        let tools = [s | Dependency (PackageName s) _ <- allTools]
        printClean $ concat $ intersperse " " tools

