{-# LANGUAGE LambdaCase #-}
module Hpack.Error (
HpackError (..)
, formatHpackError
, ProgramName (..)
, URL
, Status (..)
, formatStatus
) where
import qualified Data.ByteString.Char8 as B
import Data.List (intercalate)
import Data.String (IsString (..))
import Data.Version (Version (..), showVersion)
import Network.HTTP.Types.Status (Status (..))
type URL = String
data HpackError =
HpackVersionNotSupported FilePath Version Version
| DefaultsFileNotFound FilePath
| DefaultsDownloadFailed URL Status
| CycleInDefaults [FilePath]
| ParseError String
| DecodeValueError FilePath String
deriving (HpackError -> HpackError -> Bool
(HpackError -> HpackError -> Bool)
-> (HpackError -> HpackError -> Bool) -> Eq HpackError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HpackError -> HpackError -> Bool
$c/= :: HpackError -> HpackError -> Bool
== :: HpackError -> HpackError -> Bool
$c== :: HpackError -> HpackError -> Bool
Eq, Int -> HpackError -> ShowS
[HpackError] -> ShowS
HpackError -> String
(Int -> HpackError -> ShowS)
-> (HpackError -> String)
-> ([HpackError] -> ShowS)
-> Show HpackError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HpackError] -> ShowS
$cshowList :: [HpackError] -> ShowS
show :: HpackError -> String
$cshow :: HpackError -> String
showsPrec :: Int -> HpackError -> ShowS
$cshowsPrec :: Int -> HpackError -> ShowS
Show)
newtype ProgramName = ProgramName {ProgramName -> String
unProgramName :: String}
deriving (ProgramName -> ProgramName -> Bool
(ProgramName -> ProgramName -> Bool)
-> (ProgramName -> ProgramName -> Bool) -> Eq ProgramName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ProgramName -> ProgramName -> Bool
$c/= :: ProgramName -> ProgramName -> Bool
== :: ProgramName -> ProgramName -> Bool
$c== :: ProgramName -> ProgramName -> Bool
Eq, Int -> ProgramName -> ShowS
[ProgramName] -> ShowS
ProgramName -> String
(Int -> ProgramName -> ShowS)
-> (ProgramName -> String)
-> ([ProgramName] -> ShowS)
-> Show ProgramName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ProgramName] -> ShowS
$cshowList :: [ProgramName] -> ShowS
show :: ProgramName -> String
$cshow :: ProgramName -> String
showsPrec :: Int -> ProgramName -> ShowS
$cshowsPrec :: Int -> ProgramName -> ShowS
Show)
instance IsString ProgramName where
fromString :: String -> ProgramName
fromString = String -> ProgramName
ProgramName
formatHpackError :: ProgramName -> HpackError -> String
formatHpackError :: ProgramName -> HpackError -> String
formatHpackError (ProgramName String
progName) = \ case
HpackVersionNotSupported String
file Version
wanted Version
supported ->
String
"The file " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" requires version " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion Version
wanted String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
" of the Hpack package specification, however this version of " String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
progName String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" only supports versions up to " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion Version
supported String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
". Upgrading to the latest version of " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
progName String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" may resolve this issue."
DefaultsFileNotFound String
file -> String
"Invalid value for \"defaults\"! File " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" does not exist!"
DefaultsDownloadFailed String
url Status
status -> String
"Error while downloading " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
url String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Status -> String
formatStatus Status
status String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
CycleInDefaults [String]
files -> String
"cycle in defaults (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
" -> " [String]
files String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
ParseError String
err -> String
err
DecodeValueError String
file String
err -> String
file String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
err
formatStatus :: Status -> String
formatStatus :: Status -> String
formatStatus (Status Int
code ByteString
message) = Int -> String
forall a. Show a => a -> String
show Int
code String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ByteString -> String
B.unpack ByteString
message