packages feed

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)