{-# LANGUAGE ScopedTypeVariables #-}

module Antiope.Core.Error
  ( handle404ToNone
  ) where

import Control.Monad.Catch       (catch, throwM)
import Network.AWS               (Error (..), MonadAWS, ServiceError (..))
import Network.HTTP.Types.Status (Status (..))

import qualified Data.ByteString.Lazy as LBS

handle404ToNone :: MonadAWS m
  => m a
  -> m (Maybe a)
handle404ToNone f = do
  ebs <- (Right <$> f) `catch` \(err :: Error) -> case err of
    (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left LBS.empty)
    _                                                       -> throwM err
  case ebs of
    Right bs -> return (Just bs)
    Left _   -> return Nothing