packages feed

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

{-# LANGUAGE LambdaCase #-}

module Groot.Exception.TaskDef where

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

import           Groot.Types

data TaskDefException =
    TaskDefNotFound TaskDefNotFound
  | FailedToRegisterTaskDef FailedToRegisterTaskDef
  deriving (Eq, Show, Typeable)

instance Exception TaskDefException

data TaskDefNotFound = TaskDefNotFound' TaskDefRef
  deriving (Eq, Show, Typeable)

instance Exception TaskDefNotFound

taskDefNotFound :: TaskDefRef -> SomeException
taskDefNotFound = toException . TaskDefNotFound . TaskDefNotFound'

data FailedToRegisterTaskDef = FailedToRegisterTaskDef' TaskDefRef
  deriving (Eq, Show, Typeable)

instance Exception FailedToRegisterTaskDef

failedToRegisterTaskDef :: TaskDefRef -> SomeException
failedToRegisterTaskDef = toException . FailedToRegisterTaskDef . FailedToRegisterTaskDef'

class AsTaskDefException t where
  _TaskDefException :: Prism' t TaskDefException
  {-# MINIMAL _TaskDefException #-}

  _TaskDefNotFound :: Prism' t TaskDefNotFound
  _TaskDefNotFound = _TaskDefException . _TaskDefNotFound

  _FailedToRegisterTaskDef :: Prism' t FailedToRegisterTaskDef
  _FailedToRegisterTaskDef = _TaskDefException . _FailedToRegisterTaskDef

instance AsTaskDefException SomeException where
  _TaskDefException = exception

instance AsTaskDefException TaskDefException where
  _TaskDefException = id

  _TaskDefNotFound = prism TaskDefNotFound $ \case
    TaskDefNotFound e -> Right e
    x                 -> Left x

  _FailedToRegisterTaskDef = prism FailedToRegisterTaskDef $ \case
    FailedToRegisterTaskDef e -> Right e
    x                         -> Left x