packages feed

hnix-store-core-0.9.0.0: src/System/Nix/Build.hs

{-|
Description : Build related types
Maintainer  : srk <srk@48.io>
|-}
module System.Nix.Build
  ( BuildMode(..)
  , BuildSuccessStatus(..)
  , BuildFailureStatus(..)
  , BuildResult(..)
  , BuildSuccess(..)
  , BuildFailure(..)
  ) where

import Data.Map (Map)
import Data.Time (UTCTime)
import Data.Text (Text)
import Data.Word (Word64)
import GHC.Generics (Generic)

import System.Nix.OutputName (OutputName)
import System.Nix.Realisation (Realisation)

-- | Mode of the build operation
-- Keep the order of these Enums to match enums from reference implementations
-- src/libstore/store-api.hh
data BuildMode
  = BuildMode_Normal -- ^ Perform normal build
  | BuildMode_Repair -- ^ Try to repair corrupted or missing paths by re-building or re-downloading them
  | BuildMode_Check -- ^ Check if the build is reproducible (rebuild and compare to previous build)
  deriving (Bounded, Eq, Generic, Ord, Enum, Show)

-- | Successful build status
-- Keep the order of these Enums to match enums from reference implementations
-- Must be disjoint with BuildFailureStatus
data BuildSuccessStatus
  = BuildSuccessStatus_Built -- ^ Build performed successfully
  | BuildSuccessStatus_Substituted -- ^ Path substituted from cache
  | BuildSuccessStatus_AlreadyValid -- ^ Path is already valid (available in local store)
  | BuildSuccessStatus_ResolvesToAlreadyValid
  deriving (Bounded, Eq, Generic, Ord, Enum, Show)

-- | Failed build status
-- Keep the order of these Enums to match enums from reference implementations
-- Must be disjoint with BuildSuccessStatus
data BuildFailureStatus
  = BuildFailureStatus_PermanentFailure
  | BuildFailureStatus_InputRejected
  | BuildFailureStatus_OutputRejected
  | BuildFailureStatus_TransientFailure -- ^ Possibly transient build failure
  | BuildFailureStatus_CachedFailure -- ^ Obsolete
  | BuildFailureStatus_TimedOut -- ^ Build timed out
  | BuildFailureStatus_MiscFailure
  | BuildFailureStatus_DependencyFailed -- ^ Build dependency failed to build
  | BuildFailureStatus_LogLimitExceeded
  | BuildFailureStatus_NotDeterministic
  | BuildFailureStatus_NoSubstituters
  | BuildFailureStatus_HashMismatch -- ^ A certain type of OutputRejected
  deriving (Bounded, Eq, Generic, Ord, Enum, Show)

-- | Successful build result
data BuildSuccess = BuildSuccess
  { buildSuccessStatus :: BuildSuccessStatus
  , buildSuccessBuiltOutputs :: Map OutputName Realisation
  -- ^ Mapping of the output names to Realisations
  }
  deriving (Eq, Generic, Ord, Show)

-- | Failed build result
data BuildFailure = BuildFailure
  { buildFailureStatus :: BuildFailureStatus
  -- ^ Failure status code
  , buildFailureErrorMsg :: Text
  -- ^ Error message describing the failure
  , buildFailureIsNonDeterministic :: Bool
  -- ^ Whether the build was non-deterministic
  }
  deriving (Eq, Generic, Ord, Show)

-- | Result of the build
data BuildResult = BuildResult
  { buildResultStatus :: Either BuildFailure BuildSuccess
  -- ^ Success or failure with associated data
  , buildResultTimesBuilt :: Word64
  -- ^ How many times this build was performed
  , buildResultStartTime :: UTCTime
  -- ^ Start time of this build
  , buildResultStopTime :: UTCTime
  -- ^ Stop time of this build
  , buildResultCpuUser :: Maybe Word64
  -- ^ User CPU time in microseconds
  , buildResultCpuSystem :: Maybe Word64
  -- ^ System CPU time in microseconds
  }
  deriving (Eq, Generic, Ord, Show)