module HIE.Bios.Cradle.Resolved
  ( ResolvedCradles(..)
  , ResolvedCradle(..)
  , ConcreteCradle(..)
  ) where

import HIE.Bios.Cradle.ProgramVersions
import HIE.Bios.Config

-- | The final cradle config that specifies the cradle for
-- each prefix we know how to handle
data ResolvedCradles a = ResolvedCradles
 { forall a. ResolvedCradles a -> FilePath
cradleRoot :: FilePath
 , forall a. ResolvedCradles a -> [ResolvedCradle a]
resolvedCradles :: [ResolvedCradle a] -- ^ In order of decreasing specificity
 , forall a. ResolvedCradles a -> ProgramVersions
cradleProgramVersions :: ProgramVersions
 }

-- | 'ConcreteCradle' augmented with information on which file the
-- cradle applies
data ResolvedCradle a = ResolvedCradle
 { forall a. ResolvedCradle a -> FilePath
prefix :: FilePath -- ^ the prefix to match files
 , forall a. ResolvedCradle a -> [FilePath]
cradleDeps :: [FilePath] -- ^ accumulated dependencies
 , forall a. ResolvedCradle a -> ConcreteCradle a
concreteCradle :: ConcreteCradle a
 } deriving Int -> ResolvedCradle a -> ShowS
[ResolvedCradle a] -> ShowS
ResolvedCradle a -> FilePath
(Int -> ResolvedCradle a -> ShowS)
-> (ResolvedCradle a -> FilePath)
-> ([ResolvedCradle a] -> ShowS)
-> Show (ResolvedCradle a)
forall a. Show a => Int -> ResolvedCradle a -> ShowS
forall a. Show a => [ResolvedCradle a] -> ShowS
forall a. Show a => ResolvedCradle a -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> ResolvedCradle a -> ShowS
showsPrec :: Int -> ResolvedCradle a -> ShowS
$cshow :: forall a. Show a => ResolvedCradle a -> FilePath
show :: ResolvedCradle a -> FilePath
$cshowList :: forall a. Show a => [ResolvedCradle a] -> ShowS
showList :: [ResolvedCradle a] -> ShowS
Show

-- | The actual type of action we will be using to process a file
data ConcreteCradle a
  = ConcreteCabal CabalType
  | ConcreteStack StackType
  | ConcreteBios Callable (Maybe Callable) (Maybe FilePath)
  | ConcreteDirect [String]
  | ConcreteNone
  | ConcreteOther a
  deriving Int -> ConcreteCradle a -> ShowS
[ConcreteCradle a] -> ShowS
ConcreteCradle a -> FilePath
(Int -> ConcreteCradle a -> ShowS)
-> (ConcreteCradle a -> FilePath)
-> ([ConcreteCradle a] -> ShowS)
-> Show (ConcreteCradle a)
forall a. Show a => Int -> ConcreteCradle a -> ShowS
forall a. Show a => [ConcreteCradle a] -> ShowS
forall a. Show a => ConcreteCradle a -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> ConcreteCradle a -> ShowS
showsPrec :: Int -> ConcreteCradle a -> ShowS
$cshow :: forall a. Show a => ConcreteCradle a -> FilePath
show :: ConcreteCradle a -> FilePath
$cshowList :: forall a. Show a => [ConcreteCradle a] -> ShowS
showList :: [ConcreteCradle a] -> ShowS
Show