packages feed

groot-0.0.1.0: src/Groot/Exception/Task.hs

{-# LANGUAGE LambdaCase #-}

module Groot.Exception.Task where

import           Control.Exception.Lens
import           Control.Lens
import           Control.Monad.Catch    hiding (Handler)
import           Data.Typeable
import           Groot.Types

data TaskException =
    TaskNotFound TaskNotFound
  | InvalidTaskStatus InvalidTaskStatus
  | TaskStatusTransitionFailed TaskStatusTransitionFailed
  deriving (Eq, Show, Typeable)

instance Exception TaskException

data TaskNotFound =
  TaskNotFound' TaskRef (Maybe ClusterRef)
  deriving (Eq, Show, Typeable)

instance Exception TaskNotFound

taskNotFound :: TaskRef -> Maybe ClusterRef -> SomeException
taskNotFound taskRef clusterRef =
  toException . TaskNotFound $ TaskNotFound' taskRef clusterRef

data InvalidTaskStatus =
  InvalidTaskStatus' TaskRef TaskStatus (Maybe TaskStatus)
  deriving (Eq, Show, Typeable)

instance Exception InvalidTaskStatus

invalidTaskStatus :: TaskRef -> TaskStatus -> Maybe TaskStatus -> SomeException
invalidTaskStatus taskRef currentSt desiredSt =
  toException . InvalidTaskStatus $ InvalidTaskStatus' taskRef currentSt desiredSt

data TaskStatusTransitionFailed =
  TaskStatusTransitionFailed' TaskRef TaskStatus TaskStatus
  deriving (Eq, Show, Typeable)

taskStatusTransitionFailed :: TaskRef -> TaskStatus -> TaskStatus -> SomeException
taskStatusTransitionFailed taskRef currentSt desiredSt =
  toException . TaskStatusTransitionFailed $ TaskStatusTransitionFailed' taskRef currentSt desiredSt

instance Exception TaskStatusTransitionFailed

class AsTaskException t where
  _TaskException :: Prism' t TaskException
  {-# MINIMAL _TaskException #-}

  _TaskNotFound :: Prism' t TaskNotFound
  _TaskNotFound = _TaskException . _TaskNotFound

  _InvalidTaskStatus :: Prism' t InvalidTaskStatus
  _InvalidTaskStatus = _TaskException . _InvalidTaskStatus

  _TaskStatusTransitionFailed :: Prism' t TaskStatusTransitionFailed
  _TaskStatusTransitionFailed = _TaskException . _TaskStatusTransitionFailed

instance AsTaskException SomeException where
  _TaskException = exception

instance AsTaskException TaskException where
  _TaskException = id

  _TaskNotFound = prism TaskNotFound $ \case
    TaskNotFound e -> Right e
    x              -> Left x

  _InvalidTaskStatus = prism InvalidTaskStatus $ \case
    InvalidTaskStatus e -> Right e
    x                   -> Left x

  _TaskStatusTransitionFailed = prism TaskStatusTransitionFailed $ \case
    TaskStatusTransitionFailed e -> Right e
    x                            -> Left x