module Hix.Env where

import qualified Data.Text.IO as Text

import Hix.Component (targetComponent)
import qualified Hix.Data.ComponentConfig
import Hix.Data.ComponentConfig (EnvRunner (EnvRunner), PackagesConfig, Target (Target))
import Hix.Data.Error (pathText)
import qualified Hix.Data.GhciConfig
import Hix.Json (jsonConfig)
import Hix.Monad (M)
import qualified Hix.Options as Options
import Hix.Options (EnvRunnerOptions, TargetSpec)

componentRunner :: PackagesConfig -> TargetSpec -> M (Maybe EnvRunner)
componentRunner :: PackagesConfig -> TargetSpec -> M (Maybe EnvRunner)
componentRunner PackagesConfig
config TargetSpec
spec = do
  Target {ComponentConfig
$sel:component:Target :: Target -> ComponentConfig
component :: ComponentConfig
component} <- PackagesConfig -> TargetSpec -> M Target
targetComponent PackagesConfig
config TargetSpec
spec
  forall (f :: * -> *) a. Applicative f => a -> f a
pure ComponentConfig
component.runner

envRunner :: EnvRunnerOptions -> M EnvRunner
envRunner :: EnvRunnerOptions -> M EnvRunner
envRunner EnvRunnerOptions
opts = do
  EnvConfig
config <- forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. FromJSON a => JsonConfig -> M a
jsonConfig EnvRunnerOptions
opts.config
  forall a. a -> Maybe a -> a
fromMaybe EnvConfig
config.defaultEnv forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => m (m a) -> m a
join forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (PackagesConfig -> TargetSpec -> M (Maybe EnvRunner)
componentRunner EnvConfig
config.packages) EnvRunnerOptions
opts.component

printEnvRunner :: EnvRunnerOptions -> M ()
printEnvRunner :: EnvRunnerOptions -> M ()
printEnvRunner EnvRunnerOptions
opts = do
  EnvRunner Path Abs File
runner <- EnvRunnerOptions -> M EnvRunner
envRunner EnvRunnerOptions
opts
  forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Text -> IO ()
Text.putStrLn (forall b t. Path b t -> Text
pathText Path Abs File
runner))