{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

module HaskellWorks.CabalCache.AppError
  ( AppError(..)
  , displayAppError
  , appErrorStatus
  ) where

import Data.String
import Data.Text                    (Text)
import GHC.Generics
import HaskellWorks.CabalCache.Show

import qualified Data.Text          as T
import qualified Network.HTTP.Types as HTTP

data AppError
  = AwsAppError
    { AppError -> Status
status :: HTTP.Status
    }
  | HttpAppError
    { status :: HTTP.Status
    }
  | RetriesFailedAppError
  | NotFound
  | GenericAppError Text
  deriving (AppError -> AppError -> Bool
(AppError -> AppError -> Bool)
-> (AppError -> AppError -> Bool) -> Eq AppError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AppError -> AppError -> Bool
$c/= :: AppError -> AppError -> Bool
== :: AppError -> AppError -> Bool
$c== :: AppError -> AppError -> Bool
Eq, Int -> AppError -> ShowS
[AppError] -> ShowS
AppError -> String
(Int -> AppError -> ShowS)
-> (AppError -> String) -> ([AppError] -> ShowS) -> Show AppError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AppError] -> ShowS
$cshowList :: [AppError] -> ShowS
show :: AppError -> String
$cshow :: AppError -> String
showsPrec :: Int -> AppError -> ShowS
$cshowsPrec :: Int -> AppError -> ShowS
Show, (forall x. AppError -> Rep AppError x)
-> (forall x. Rep AppError x -> AppError) -> Generic AppError
forall x. Rep AppError x -> AppError
forall x. AppError -> Rep AppError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AppError x -> AppError
$cfrom :: forall x. AppError -> Rep AppError x
Generic)

instance IsString AppError where
  fromString :: String -> AppError
fromString = Text -> AppError
GenericAppError (Text -> AppError) -> (String -> Text) -> String -> AppError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack

displayAppError :: AppError -> Text
displayAppError :: AppError -> Text
displayAppError (AwsAppError Status
s)       = Status -> Text
forall a. Show a => a -> Text
tshow Status
s
displayAppError (HttpAppError Status
s)      = Status -> Text
forall a. Show a => a -> Text
tshow Status
s
displayAppError AppError
RetriesFailedAppError = Text
"Multiple retries failed"
displayAppError AppError
NotFound              = Text
"Not found"
displayAppError (GenericAppError Text
msg) = Text
msg

appErrorStatus :: AppError -> Maybe Int
appErrorStatus :: AppError -> Maybe Int
appErrorStatus (AwsAppError (HTTP.Status Int
statusCode ByteString
_)) = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
statusCode
appErrorStatus AppError
_                                        = Maybe Int
forall a. Maybe a
Nothing