module Hix.Env where import qualified Data.Text.IO as Text import Path (Abs, Dir, Path) 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 :: Maybe (Path Abs Dir) -> PackagesConfig -> TargetSpec -> M (Maybe EnvRunner) componentRunner :: Maybe (Path Abs Dir) -> PackagesConfig -> TargetSpec -> M (Maybe EnvRunner) componentRunner Maybe (Path Abs Dir) cliRoot PackagesConfig config TargetSpec spec = do Target {ComponentConfig $sel:component:Target :: Target -> ComponentConfig component :: ComponentConfig component} <- Maybe (Path Abs Dir) -> PackagesConfig -> TargetSpec -> M Target targetComponent Maybe (Path Abs Dir) cliRoot 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 (Maybe (Path Abs Dir) -> PackagesConfig -> TargetSpec -> M (Maybe EnvRunner) componentRunner EnvRunnerOptions opts.root 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))