hix-0.7.0: lib/Hix/Managed/EnvContext.hs
module Hix.Managed.EnvContext where
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.Set as Set
import Exon (exon)
import Hix.Class.Map (nKeysSet, nMapWithKey)
import Hix.Data.EnvName (EnvName)
import Hix.Data.Monad (M)
import qualified Hix.Data.Options
import Hix.Data.Options (ProjectOptions)
import Hix.Data.PackageName (LocalPackage)
import qualified Hix.Managed.Data.EnvConfig
import Hix.Managed.Data.EnvConfig (EnvConfig)
import qualified Hix.Managed.Data.EnvContext
import Hix.Managed.Data.EnvContext (EnvContext (EnvContext), EnvDeps (EnvDeps))
import Hix.Managed.Data.Envs (Envs)
import Hix.Managed.Data.ManagedPackage (ManagedPackage)
import Hix.Managed.Data.Mutable (MutableDep, mutRelax)
import Hix.Managed.Data.Packages (Packages)
import qualified Hix.Managed.ManagedPackage as ManagedPackage
import Hix.Monad (clientError)
import Hix.Pretty (showPL)
unknownTargets :: EnvName -> NonEmpty LocalPackage -> M ()
unknownTargets env missing =
clientError msg
where
msg =
[exon|The flake config for '##{env}' references #{number} in its targets that #{verb} present|]
<>
[exon| in the configuration: #{showPL (toList missing)}|]
(number, verb) | [_] <- missing = ("a package", "isn't")
| otherwise = ("several packages", "aren't")
envContext ::
ProjectOptions ->
Packages ManagedPackage ->
Maybe (NonEmpty MutableDep) ->
EnvName ->
EnvConfig ->
Either EnvDeps EnvContext
envContext opts packages querySpec env envConfig =
maybeToRight deps (create <$> nonEmpty envQuery)
where
create query = EnvContext {ghc = envConfig.ghc, query, deps, ..}
deps = EnvDeps {local, mutable}
solverBounds | opts.mergeBounds = mutRelax mutableDeps
| otherwise = mempty
envQuery = maybe (toList mutable) (NonEmpty.filter (flip Set.member mutable)) querySpec
local = nKeysSet localDeps
mutable = nKeysSet mutableDeps
(targets, localDeps, mutableDeps) = ManagedPackage.forTargets packages envConfig.targets
envContexts ::
ProjectOptions ->
Packages ManagedPackage ->
Envs EnvConfig ->
Maybe (NonEmpty MutableDep) ->
M (Envs (Either EnvDeps EnvContext))
envContexts opts packages envConfigs query = do
pure (nMapWithKey (envContext opts packages query) envConfigs)