packages feed

hix-0.9.0: lib/Hix/Managed/Data/StageState.hs

module Hix.Managed.Data.StageState where

import Distribution.Pretty (Pretty (pretty))
import Text.PrettyPrint (brackets, hang, vcat, (<+>))

import Hix.Data.Error (Error)
import Hix.Data.PackageId (PackageId)
import Hix.Managed.Data.Initial (Initial (Initial))
import Hix.Managed.Data.Mutable (MutableDep)
import qualified Hix.Managed.Data.MutableId
import Hix.Managed.Data.MutableId (MutableId (MutableId))
import Hix.Managed.Data.Mutation (DepMutation)
import Hix.Managed.Data.MutationState (MutationState)
import Hix.Managed.Data.NixOutput (PackageDerivation)
import Hix.Pretty (prettyL, prettyText)

data BuildStatus =
  Success
  |
  Failure
  deriving stock (Eq, Show, Generic)

justSuccess :: a -> BuildStatus -> Maybe a
justSuccess a = \case
  Success -> Just a
  Failure -> Nothing

data BuildFailure =
  AppFailure Error
  |
  UnknownFailure
  |
  UnexpectedFailure (NonEmpty Text)
  |
  PackageFailure (NonEmpty PackageDerivation)
  |
  TimeoutFailure [PackageId]
  deriving stock (Eq, Show, Generic)

instance Pretty BuildFailure where
  pretty = \case
    AppFailure err -> "App failure:" <+> pretty err
    UnknownFailure -> "Unknown failure"
    UnexpectedFailure msgs -> hang "Unexpected failure:" 2 (vcat (prettyText <$> toList msgs))
    PackageFailure drvs -> "Package failures in" <+> prettyL drvs
    TimeoutFailure pkgs -> "Timeout failure, active builds:" <+> prettyL pkgs

data BuildResult =
  BuildSuccess [Text]
  |
  BuildFailure BuildFailure
  deriving stock (Eq, Show, Generic)

instance Pretty BuildResult where
  pretty = \case
    BuildSuccess [line] -> "Success" <+> brackets (prettyText line)
    BuildSuccess _ -> "Success"
    BuildFailure f -> pretty f

buildUnsuccessful :: BuildResult -> Bool
buildUnsuccessful = \case
  BuildSuccess _ -> False
  BuildFailure _ -> True

buildStatus :: BuildResult -> BuildStatus
buildStatus = \case
  BuildSuccess _ -> Success
  BuildFailure _ -> Failure

resultFromStatus :: BuildStatus -> BuildResult
resultFromStatus = \case
  Success -> BuildSuccess []
  Failure -> BuildFailure UnknownFailure

data BuildSuccess =
  CandidateBuilt MutableId
  |
  Unmodified MutableDep
  deriving stock (Eq, Show, Generic)

buildSuccessPackage :: BuildSuccess -> MutableDep
buildSuccessPackage = \case
  CandidateBuilt MutableId {name} -> name
  Unmodified name -> name

modifiedCandidates :: [BuildSuccess] -> [MutableId]
modifiedCandidates =
  mapMaybe \case
    CandidateBuilt candidate -> Just candidate
    Unmodified _ -> Nothing

data StageState a s =
  StageState {
    success :: Map MutableDep BuildSuccess,
    failed :: [DepMutation a],
    state :: MutationState,
    iterations :: Word,
    ext :: s
  }
  deriving stock (Eq, Show)

initStageState :: Initial MutationState -> s -> StageState a s
initStageState (Initial state) ext =
  StageState {success = [], failed = [], iterations = 0, ..}