{- DisTract ------------------------------------------------------\
 |                                                                 |
 | Copyright (c) 2007, Matthew Sackman (matthew@wellquite.org)     |
 |                                                                 |
 | DisTract is freely distributable under the terms of a 3-Clause  |
 | BSD-style license. For details, see the DisTract web site:      |
 |   http://distract.wellquite.org/                                |
 |                                                                 |
 \-----------------------------------------------------------------}

{-# LANGUAGE TemplateHaskell #-}

module DisTract.Version (getNameVersionFromCabal)
    where

import Data.Version
import Distribution.PackageDescription
import Distribution.Package
import Language.Haskell.TH.Syntax
import Distribution.Verbosity (silent)

getNameVersionFromCabal :: FilePath -> Q [Dec]
getNameVersionFromCabal path
    = do { desc <- runIO $ readPackageDescription silent path
         ; makeNameVersionDeclarations desc
         }

makeNameVersionDeclarations :: GenericPackageDescription -> Q [Dec]
makeNameVersionDeclarations desc
    = do { versionD <- [d| package_version :: String; package_version = $(lift $ versionStr desc) |]
         ; nameD <- [d| package_name :: String; package_name = $(lift $ name desc) |]
         ; return $ nameD ++ versionD
         }

name :: GenericPackageDescription -> String
name desc = pkgName $ pkgId desc

pkgId :: GenericPackageDescription -> PackageIdentifier
pkgId desc = package $ packageDescription desc

versionStr :: GenericPackageDescription -> String
versionStr desc = showVersion $ version desc

version :: GenericPackageDescription -> Version
version desc = pkgVersion $ pkgId desc