module Hix.Managed.Build.Single where

import Hix.Data.Monad (M)
import Hix.Data.VersionBounds (exactVersion)
import Hix.Managed.Build (buildConstraints)
import Hix.Managed.Cabal.Data.SolverState (solverState)
import Hix.Managed.Constraints (fromVersions)
import qualified Hix.Managed.Data.EnvContext
import Hix.Managed.Data.EnvContext (EnvContext)
import Hix.Managed.Data.Mutable (MutableVersions)
import Hix.Managed.Data.StageState (BuildStatus (Failure))
import Hix.Managed.Handlers.Build (EnvBuilder)

-- | Passes 'False' to 'buildConstraints' to disable revisions, since this function is used to check whether the current
-- configuration builds successful, and revisions modify the set of overrides on failure.
buildVersions ::
  EnvBuilder ->
  EnvContext ->
  Text ->
  MutableVersions ->
  M BuildStatus
buildVersions :: EnvBuilder
-> EnvContext -> Text -> MutableVersions -> M BuildStatus
buildVersions EnvBuilder
builder EnvContext
context Text
description MutableVersions
versions =
  EnvBuilder
-> EnvContext
-> Text
-> Bool
-> Set PackageId
-> SolverState
-> M (Maybe (Versions, Overrides, Set PackageId, BuildStatus))
buildConstraints EnvBuilder
builder EnvContext
context Text
description Bool
False [] SolverState
solver M (Maybe (Versions, Overrides, Set PackageId, BuildStatus))
-> (Maybe (Versions, Overrides, Set PackageId, BuildStatus)
    -> BuildStatus)
-> M BuildStatus
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
    Just (Versions
_, Overrides
_, Set PackageId
_, BuildStatus
status) -> BuildStatus
status
    Maybe (Versions, Overrides, Set PackageId, BuildStatus)
Nothing -> BuildStatus
Failure
  where
    solver :: SolverState
solver = Ranges -> EnvDeps -> EnvConstraints -> SolverFlags -> SolverState
solverState EnvContext
context.solverBounds EnvContext
context.deps ((Version -> VersionBounds) -> MutableVersions -> EnvConstraints
fromVersions Version -> VersionBounds
exactVersion MutableVersions
versions) SolverFlags
forall a. Default a => a
def