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))