hpack-0.35.1: src/Hpack/Error.hs
{-# LANGUAGE LambdaCase #-}
module Hpack.Error (
-- | /__NOTE:__/ This module is exposed to allow integration of Hpack into
-- other tools. It is not meant for general use by end users. The following
-- caveats apply:
--
-- * The API is undocumented, consult the source instead.
--
-- * The exposed types and functions primarily serve Hpack's own needs, not
-- that of a public API. Breaking changes can happen as Hpack evolves.
--
-- As an Hpack user you either want to use the @hpack@ executable or a build
-- tool that supports Hpack (e.g. @stack@ or @cabal2nix@).
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 (Eq, Show)
newtype ProgramName = ProgramName {unProgramName :: String}
deriving (Eq, Show)
instance IsString ProgramName where
fromString = ProgramName
formatHpackError :: ProgramName -> HpackError -> String
formatHpackError (ProgramName progName) = \ case
HpackVersionNotSupported file wanted supported ->
"The file " ++ file ++ " requires version " ++ showVersion wanted ++
" of the Hpack package specification, however this version of " ++
progName ++ " only supports versions up to " ++ showVersion supported ++
". Upgrading to the latest version of " ++ progName ++ " may resolve this issue."
DefaultsFileNotFound file -> "Invalid value for \"defaults\"! File " ++ file ++ " does not exist!"
DefaultsDownloadFailed url status -> "Error while downloading " ++ url ++ " (" ++ formatStatus status ++ ")"
CycleInDefaults files -> "cycle in defaults (" ++ intercalate " -> " files ++ ")"
ParseError err -> err
DecodeValueError file err -> file ++ ": " ++ err
formatStatus :: Status -> String
formatStatus (Status code message) = show code ++ " " ++ B.unpack message