content: module Utils.FriendlyReqError (friendlyReqError) where
  
  import Data.Text (Text, isInfixOf, pack)
  import Network.HTTP.Client
  import qualified Network.HTTP.Req as Req
  import Network.HTTP.Types.Status
  
  friendlyReqError :: Req.HttpException -> Text
  
  friendlyReqError (Req.VanillaHttpException (HttpExceptionRequest _ (StatusCodeException resp _)))
    | responseStatus resp == unauthorized401 = "Error: The username or API token was incorrect."
    | otherwise                              = "Error: Received an unexpected HTTP "
                                               <> pack (show (statusCode (responseStatus resp))) <>
                                               " response from the server."
  
  friendlyReqError (Req.VanillaHttpException (HttpExceptionRequest _ ResponseTimeout)) =
      "Error: The server took too long to return a response."
  
  friendlyReqError (Req.VanillaHttpException (HttpExceptionRequest _ ConnectionTimeout)) =
      "Error: Attempting to connect to the server timed out."
  
  friendlyReqError (Req.VanillaHttpException (HttpExceptionRequest _ (ConnectionFailure exc)))
    | "nodename nor servname provided, or not known" `isInfixOf` (pack (show exc)) =
        "Error: The Pinboard server's IP address could not be looked up. Are\n" <>
        "you sure your internet connection is active?"
    | otherwise = "Could not connect to the server: " <> pack (show exc)
  
  friendlyReqError (Req.VanillaHttpException (HttpExceptionRequest _ other)) =
      "Error while communicating with the Pinboard server: " <> pack (show other)
  
  friendlyReqError (Req.VanillaHttpException (InvalidUrlException url reason)) =
      "Error: The URL \"" <> pack url <> "\" is invalid: " <> pack reason
  
  friendlyReqError (Req.JsonHttpException reason) = "Error decoding JSON: " <> pack reason
  