{-# LANGUAGE DeriveDataTypeable #-}

module Error (HackPortError(..), throwEx, catchEx, hackPortShowError) where

import Data.Typeable
import Control.Exception.Extensible as EE

-- | Type holding all of the 'HackPortError' constructors.
data HackPortError
    = ArgumentError String
    | ConnectionFailed String String
    | PackageNotFound String
    | InvalidTarballURL String String
    | InvalidSignatureURL String String
    | VerificationFailed String String
    | DownloadFailed String String
    | UnknownCompression String
    | UnpackingFailed String Int
    | NoCabalFound String
    | ExtractionFailed String String Int
    | CabalParseFailed String String
    | BashNotFound
    | BashError String
    | NoOverlay
    | MultipleOverlays [String]
    | UnknownVerbosityLevel String
    -- | WrongCacheVersion
    -- | InvalidCache
    | InvalidServer String
    deriving (Typeable
             , Int -> HackPortError -> ShowS
[HackPortError] -> ShowS
HackPortError -> String
(Int -> HackPortError -> ShowS)
-> (HackPortError -> String)
-> ([HackPortError] -> ShowS)
-> Show HackPortError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HackPortError] -> ShowS
$cshowList :: [HackPortError] -> ShowS
show :: HackPortError -> String
$cshow :: HackPortError -> String
showsPrec :: Int -> HackPortError -> ShowS
$cshowsPrec :: Int -> HackPortError -> ShowS
Show
             , Eq -- ^ needed for spec test-suite
             )

instance Exception HackPortError where

-- | Throw a 'HackPortError'.
throwEx :: HackPortError -> IO a
throwEx :: HackPortError -> IO a
throwEx = HackPortError -> IO a
forall a e. Exception e => e -> a
EE.throw

-- | Catch a 'HackPortError'.
catchEx :: IO a -> (HackPortError -> IO a) -> IO a
catchEx :: IO a -> (HackPortError -> IO a) -> IO a
catchEx = IO a -> (HackPortError -> IO a) -> IO a
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
EE.catch

-- | Show the error string for a given 'HackPortError'.
hackPortShowError :: HackPortError -> String
hackPortShowError :: HackPortError -> String
hackPortShowError HackPortError
err = case HackPortError
err of
    ArgumentError String
str -> String
"Argument error: "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
str
    ConnectionFailed String
server String
reason -> String
"Connection to hackage server '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
serverString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' failed: "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
reason
    PackageNotFound String
pkg -> String
"Package '"String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
pkg String -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' not found on server. Try 'hackport update'?"
    InvalidTarballURL String
url String
reason -> String
"Error while downloading tarball '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
urlString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"': "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
reason
    InvalidSignatureURL String
url String
reason -> String
"Error while downloading signature '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
urlString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"': "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
reason
    VerificationFailed String
file String
signature -> String
"Error while checking signature('"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
signatureString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"') of '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
fileString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"'"
    DownloadFailed String
url String
reason -> String
"Error while downloading '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
urlString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"': "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
reason
    UnknownCompression String
tarball -> String
"Couldn't guess compression type of '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
tarballString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"'"
    UnpackingFailed String
tarball Int
code -> String
"Unpacking '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
tarballString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' failed with exit code '"String -> ShowS
forall a. [a] -> [a] -> [a]
++Int -> String
forall a. Show a => a -> String
show Int
codeString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"'"
    NoCabalFound String
tarball -> String
"Tarball '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
tarballString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' doesn't contain a cabal file"
    ExtractionFailed String
tarball String
file Int
code -> String
"Extracting '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
fileString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' from '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
tarballString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' failed with '"String -> ShowS
forall a. [a] -> [a] -> [a]
++Int -> String
forall a. Show a => a -> String
show Int
codeString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"'"
    CabalParseFailed String
file String
reason -> String
"Error while parsing cabal file '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
fileString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"': "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
reason
    HackPortError
BashNotFound -> String
"The 'bash' executable was not found. It is required to figure out your portage-overlay. If you don't want to install bash, use '-p path-to-overlay'"
    BashError String
str -> String
"Error while guessing your repository's location. Either set a repository 'haskell' in '/etc/portage/repos.conf' or use '-p path-to-overlay'.\nThe error was: \""String -> ShowS
forall a. [a] -> [a] -> [a]
++String
strString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"\""
    MultipleOverlays [String]
overlays -> String
"You have the following overlays available: '"String -> ShowS
forall a. [a] -> [a] -> [a]
++[String] -> String
unwords [String]
overlaysString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"'. Please choose one by using 'hackport -p path-to-overlay' <command>"
    HackPortError
NoOverlay -> String
"Unable to find a repository 'haskell'. Consider defining it in '/etc/portage/repos.conf' and verify '~/.hackport/repositories' (in overlay_list) or use '-p path-to-overlay'"
    UnknownVerbosityLevel String
str -> String
"The verbosity level '"String -> ShowS
forall a. [a] -> [a] -> [a]
++String
strString -> ShowS
forall a. [a] -> [a] -> [a]
++String
"' is invalid. Please use debug,normal or silent"
    InvalidServer String
srv -> String
"Invalid server address, could not parse: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
srv
    --WrongCacheVersion -> "The version of the cache is too old. Please update the cache using 'hackport update'"
    --InvalidCache -> "Could not read the cache. Please ensure that it's up to date using 'hackport update'"