{-# LANGUAGE PatternGuards, Rank2Types #-}

module CabalBounds.Targets
   ( Targets(..)
   , Target(..)
   , targets
   , dependenciesOf
   ) where

import Control.Lens
import qualified Distribution.PackageDescription as C
import qualified Distribution.Package as C
import CabalBounds.Args
import CabalBounds.Lenses

data Targets = Targets [Target]
             | AllTargets
             deriving (Show, Eq)

data Target = Library
            | Executable String
            | TestSuite String
            | Benchmark String
            deriving (Show, Eq)

targets :: Args -> Targets
targets args 
   | ts@(_:_) <- concat [ if (library args) then [Library] else []
                        , map Executable (executable args)
                        , map TestSuite (testSuite args)
                        , map Benchmark (benchmark args)
                        ]
   = Targets ts

   | otherwise
   = AllTargets


dependenciesOf :: Target -> Traversal' C.GenericPackageDescription [C.Dependency]
dependenciesOf Library            = dependenciesOfLib
dependenciesOf (Executable exe)   = dependenciesOfExe exe
dependenciesOf (TestSuite test)   = dependenciesOfTest test
dependenciesOf (Benchmark benchm) = dependenciesOfBenchm benchm