{-# LANGUAGE ScopedTypeVariables,DeriveDataTypeable #-}
{-# LINE 2 "./System/Glib/GError.chs" #-}
module System.Glib.GError (
GError(..),
GErrorDomain,
GErrorCode,
GErrorMessage,
catchGErrorJust,
catchGErrorJustDomain,
handleGErrorJust,
handleGErrorJustDomain,
catchGError,
handleGError,
failOnGError,
throwGError,
GErrorClass(..),
propagateGError,
checkGError
) where
import Foreign
import Foreign.C
import System.Glib.UTFString
import Control.Exception
import Data.Typeable
import Data.Text (Text)
import qualified Data.Text as T (unpack)
import Prelude hiding (catch)
data GError = GError !GErrorDomain !GErrorCode !GErrorMessage
deriving Typeable
instance Show GError where
show :: GError -> String
show (GError GErrorDomain
_ Int
_ GErrorMessage
msg) = GErrorMessage -> String
T.unpack GErrorMessage
msg
instance Exception GError
type GQuark = (CUInt)
{-# LINE 110 "./System/Glib/GError.chs" #-}
type GErrorDomain = GQuark
type GErrorCode = Int
type GErrorMessage = Text
instance Storable GError where
sizeOf :: GError -> Int
sizeOf GError
_ = Int
16
{-# LINE 130 "./System/Glib/GError.chs" #-}
alignment _ = alignment (undefined:: GQuark)
peek :: Ptr GError -> IO GError
peek Ptr GError
ptr = do
(GErrorDomain
domain :: GQuark) <- (\Ptr GError
ptr -> do {Ptr GError -> Int -> IO GErrorDomain
forall b. Ptr b -> Int -> IO GErrorDomain
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr GError
ptr Int
0 ::IO CUInt}) Ptr GError
ptr
(CInt
code :: (CInt)) <- (\Ptr GError
ptr -> do {Ptr GError -> Int -> IO CInt
forall b. Ptr b -> Int -> IO CInt
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr GError
ptr Int
4 ::IO CInt}) Ptr GError
ptr
(Ptr CChar
msgPtr :: CString) <- (\Ptr GError
ptr -> do {Ptr GError -> Int -> IO (Ptr CChar)
forall b. Ptr b -> Int -> IO (Ptr CChar)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr GError
ptr Int
8 ::IO (Ptr CChar)}) Ptr GError
ptr
GErrorMessage
msg <- Ptr CChar -> IO GErrorMessage
forall s. GlibString s => Ptr CChar -> IO s
peekUTFString Ptr CChar
msgPtr
GError -> IO GError
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (GError -> IO GError) -> GError -> IO GError
forall a b. (a -> b) -> a -> b
$ GErrorDomain -> Int -> GErrorMessage -> GError
GError (GErrorDomain -> GErrorDomain
forall a b. (Integral a, Num b) => a -> b
fromIntegral GErrorDomain
domain) (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
code) GErrorMessage
msg
poke :: Ptr GError -> GError -> IO ()
poke Ptr GError
_ = String -> GError -> IO ()
forall a. HasCallStack => String -> a
error String
"GError::poke: not implemented"
class Enum err => GErrorClass err where
gerrorDomain :: err -> GErrorDomain
propagateGError :: (Ptr (Ptr ()) -> IO a) -> IO a
propagateGError :: forall a. (Ptr (Ptr ()) -> IO a) -> IO a
propagateGError Ptr (Ptr ()) -> IO a
action = (Ptr (Ptr ()) -> IO a) -> (GError -> IO a) -> IO a
forall a. (Ptr (Ptr ()) -> IO a) -> (GError -> IO a) -> IO a
checkGError Ptr (Ptr ()) -> IO a
action GError -> IO a
forall a. GError -> IO a
throwGError
checkGError :: (Ptr (Ptr ()) -> IO a) -> (GError -> IO a) -> IO a
checkGError :: forall a. (Ptr (Ptr ()) -> IO a) -> (GError -> IO a) -> IO a
checkGError Ptr (Ptr ()) -> IO a
action GError -> IO a
handler =
(Ptr (Ptr GError) -> IO a) -> IO a
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr GError) -> IO a) -> IO a)
-> (Ptr (Ptr GError) -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr GError)
errPtrPtr :: Ptr (Ptr GError)) -> do
Ptr (Ptr GError) -> Ptr GError -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr (Ptr GError)
errPtrPtr Ptr GError
forall a. Ptr a
nullPtr
a
result <- Ptr (Ptr ()) -> IO a
action (Ptr (Ptr GError) -> Ptr (Ptr ())
forall a b. Ptr a -> Ptr b
castPtr Ptr (Ptr GError)
errPtrPtr)
Ptr GError
errPtr <- Ptr (Ptr GError) -> IO (Ptr GError)
forall a. Storable a => Ptr a -> IO a
peek Ptr (Ptr GError)
errPtrPtr
if Ptr GError
errPtr Ptr GError -> Ptr GError -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr GError
forall a. Ptr a
nullPtr
then a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
else do GError
gerror <- Ptr GError -> IO GError
forall a. Storable a => Ptr a -> IO a
peek Ptr GError
errPtr
Ptr () -> IO ()
g_error_free (Ptr GError -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr GError
errPtr)
GError -> IO a
handler GError
gerror
throwGError :: GError -> IO a
throwGError :: forall a. GError -> IO a
throwGError = GError -> IO a
forall a e. Exception e => e -> a
throw
{-# DEPRECATED throwGError "Use ordinary Control.Exception.throw" #-}
catchGError :: IO a
-> (GError -> IO a)
-> IO a
catchGError :: forall a. IO a -> (GError -> IO a) -> IO a
catchGError = IO a -> (GError -> IO a) -> IO a
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch
{-# DEPRECATED catchGError "Use ordinary Control.Exception.catch" #-}
catchGErrorJust :: GErrorClass err => err
-> IO a
-> (GErrorMessage -> IO a)
-> IO a
catchGErrorJust :: forall err a.
GErrorClass err =>
err -> IO a -> (GErrorMessage -> IO a) -> IO a
catchGErrorJust err
code IO a
action GErrorMessage -> IO a
handler = IO a -> (GError -> IO a) -> IO a
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch IO a
action GError -> IO a
handler'
where handler' :: GError -> IO a
handler' gerror :: GError
gerror@(GError GErrorDomain
domain Int
code' GErrorMessage
msg)
| GErrorDomain -> GErrorDomain
forall a b. (Integral a, Num b) => a -> b
fromIntegral GErrorDomain
domain GErrorDomain -> GErrorDomain -> Bool
forall a. Eq a => a -> a -> Bool
== err -> GErrorDomain
forall err. GErrorClass err => err -> GErrorDomain
gerrorDomain err
code
Bool -> Bool -> Bool
&& Int
code' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== err -> Int
forall a. Enum a => a -> Int
fromEnum err
code = GErrorMessage -> IO a
handler GErrorMessage
msg
| Bool
otherwise = GError -> IO a
forall a e. Exception e => e -> a
throw GError
gerror
catchGErrorJustDomain :: GErrorClass err => IO a
-> (err -> GErrorMessage -> IO a)
-> IO a
catchGErrorJustDomain :: forall err a.
GErrorClass err =>
IO a -> (err -> GErrorMessage -> IO a) -> IO a
catchGErrorJustDomain IO a
action (err -> GErrorMessage -> IO a
handler :: err -> GErrorMessage -> IO a) =
IO a -> (GError -> IO a) -> IO a
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch IO a
action GError -> IO a
handler'
where handler' :: GError -> IO a
handler' gerror :: GError
gerror@(GError GErrorDomain
domain Int
code GErrorMessage
msg)
| GErrorDomain -> GErrorDomain
forall a b. (Integral a, Num b) => a -> b
fromIntegral GErrorDomain
domain GErrorDomain -> GErrorDomain -> Bool
forall a. Eq a => a -> a -> Bool
== err -> GErrorDomain
forall err. GErrorClass err => err -> GErrorDomain
gerrorDomain (err
forall a. HasCallStack => a
undefined::err) = err -> GErrorMessage -> IO a
handler (Int -> err
forall a. Enum a => Int -> a
toEnum Int
code) GErrorMessage
msg
| Bool
otherwise = GError -> IO a
forall a. GError -> IO a
throwGError GError
gerror
handleGError :: (GError -> IO a) -> IO a -> IO a
handleGError :: forall a. (GError -> IO a) -> IO a -> IO a
handleGError = (GError -> IO a) -> IO a -> IO a
forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle
{-# DEPRECATED handleGError "Use ordinary Control.Exception.handle" #-}
handleGErrorJust :: GErrorClass err => err -> (GErrorMessage -> IO a) -> IO a -> IO a
handleGErrorJust :: forall err a.
GErrorClass err =>
err -> (GErrorMessage -> IO a) -> IO a -> IO a
handleGErrorJust err
code = (IO a -> (GErrorMessage -> IO a) -> IO a)
-> (GErrorMessage -> IO a) -> IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip (err -> IO a -> (GErrorMessage -> IO a) -> IO a
forall err a.
GErrorClass err =>
err -> IO a -> (GErrorMessage -> IO a) -> IO a
catchGErrorJust err
code)
handleGErrorJustDomain :: GErrorClass err => (err -> GErrorMessage -> IO a) -> IO a -> IO a
handleGErrorJustDomain :: forall err a.
GErrorClass err =>
(err -> GErrorMessage -> IO a) -> IO a -> IO a
handleGErrorJustDomain = (IO a -> (err -> GErrorMessage -> IO a) -> IO a)
-> (err -> GErrorMessage -> IO a) -> IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip IO a -> (err -> GErrorMessage -> IO a) -> IO a
forall err a.
GErrorClass err =>
IO a -> (err -> GErrorMessage -> IO a) -> IO a
catchGErrorJustDomain
failOnGError :: IO a -> IO a
failOnGError :: forall a. IO a -> IO a
failOnGError IO a
action = IO a -> (GError -> IO a) -> IO a
forall a. IO a -> (GError -> IO a) -> IO a
catchGError IO a
action (\(GError GErrorDomain
dom Int
code GErrorMessage
msg) -> String -> IO a
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (GErrorMessage -> String
T.unpack GErrorMessage
msg))
foreign import ccall unsafe "g_error_free"
g_error_free :: ((Ptr ()) -> (IO ()))