cachix-1.9.0: src/Cachix/Daemon/Types/PushEvent.hs
module Cachix.Daemon.Types.PushEvent
( PushEvent (..),
PushEventMessage (..),
PushRequestId,
PushRetryStatus (..),
newPushRequestId,
newPushRetryStatus,
)
where
import Control.Retry (RetryStatus (..))
import Data.Aeson (FromJSON, ToJSON)
import Data.Time (UTCTime)
import Data.UUID (UUID)
import Data.UUID.V4 qualified as UUID
import Protolude
data PushEvent = PushEvent
{ -- TODO: newtype a monotonic clock
eventTimestamp :: UTCTime,
eventPushId :: PushRequestId,
eventMessage :: PushEventMessage
}
deriving stock (Eq, Generic, Show)
deriving anyclass (FromJSON, ToJSON)
instance Ord PushEvent where
compare = compare `on` eventTimestamp
data PushEventMessage
= PushStarted
| PushStorePathAttempt FilePath Int64 PushRetryStatus
| PushStorePathProgress FilePath Int64 Int64
| PushStorePathDone FilePath
| PushStorePathFailed FilePath Text
| PushFinished
deriving stock (Eq, Generic, Show)
deriving anyclass (FromJSON, ToJSON)
newtype PushRequestId = PushRequestId UUID
deriving stock (Generic)
deriving newtype (Eq, Ord, Show, FromJSON, ToJSON, Hashable)
newPushRequestId :: (MonadIO m) => m PushRequestId
newPushRequestId = liftIO $ PushRequestId <$> UUID.nextRandom
data PushRetryStatus = PushRetryStatus {retryCount :: Int}
deriving stock (Eq, Generic, Show)
deriving anyclass (FromJSON, ToJSON)
newPushRetryStatus :: RetryStatus -> PushRetryStatus
newPushRetryStatus RetryStatus {..} = PushRetryStatus {retryCount = rsIterNumber}