-- | Exceptions which can be thrown by FontConfig.
module Graphics.Text.Font.Choose.Result (FcException(..), throwBool, throwNull, throwString) where

import Foreign.Ptr (Ptr, nullPtr)
import Text.Read (readMaybe)
import Control.Exception (Exception, throwIO)

-- | Exceptions which can be thrown by FontConfig.
data FcException = ErrType | ErrNoId | ErrOOM | ErrOther deriving (ReadPrec [FcException]
ReadPrec FcException
Int -> ReadS FcException
ReadS [FcException]
(Int -> ReadS FcException)
-> ReadS [FcException]
-> ReadPrec FcException
-> ReadPrec [FcException]
-> Read FcException
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS FcException
readsPrec :: Int -> ReadS FcException
$creadList :: ReadS [FcException]
readList :: ReadS [FcException]
$creadPrec :: ReadPrec FcException
readPrec :: ReadPrec FcException
$creadListPrec :: ReadPrec [FcException]
readListPrec :: ReadPrec [FcException]
Read, Int -> FcException -> ShowS
[FcException] -> ShowS
FcException -> String
(Int -> FcException -> ShowS)
-> (FcException -> String)
-> ([FcException] -> ShowS)
-> Show FcException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FcException -> ShowS
showsPrec :: Int -> FcException -> ShowS
$cshow :: FcException -> String
show :: FcException -> String
$cshowList :: [FcException] -> ShowS
showList :: [FcException] -> ShowS
Show, FcException -> FcException -> Bool
(FcException -> FcException -> Bool)
-> (FcException -> FcException -> Bool) -> Eq FcException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FcException -> FcException -> Bool
== :: FcException -> FcException -> Bool
$c/= :: FcException -> FcException -> Bool
/= :: FcException -> FcException -> Bool
Eq, Int -> FcException
FcException -> Int
FcException -> [FcException]
FcException -> FcException
FcException -> FcException -> [FcException]
FcException -> FcException -> FcException -> [FcException]
(FcException -> FcException)
-> (FcException -> FcException)
-> (Int -> FcException)
-> (FcException -> Int)
-> (FcException -> [FcException])
-> (FcException -> FcException -> [FcException])
-> (FcException -> FcException -> [FcException])
-> (FcException -> FcException -> FcException -> [FcException])
-> Enum FcException
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FcException -> FcException
succ :: FcException -> FcException
$cpred :: FcException -> FcException
pred :: FcException -> FcException
$ctoEnum :: Int -> FcException
toEnum :: Int -> FcException
$cfromEnum :: FcException -> Int
fromEnum :: FcException -> Int
$cenumFrom :: FcException -> [FcException]
enumFrom :: FcException -> [FcException]
$cenumFromThen :: FcException -> FcException -> [FcException]
enumFromThen :: FcException -> FcException -> [FcException]
$cenumFromTo :: FcException -> FcException -> [FcException]
enumFromTo :: FcException -> FcException -> [FcException]
$cenumFromThenTo :: FcException -> FcException -> FcException -> [FcException]
enumFromThenTo :: FcException -> FcException -> FcException -> [FcException]
Enum)
instance Exception FcException

-- | Converts a pass|failure return value into a Haskell exception.
throwBool :: Bool -> IO ()
throwBool :: Bool -> IO ()
throwBool Bool
False = FcException -> IO ()
forall e a. Exception e => e -> IO a
throwIO FcException
ErrOOM
throwBool Bool
True = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | Turns a failed allocation into a Haskell exception.
throwNull :: Ptr a -> IO (Ptr a)
throwNull :: forall a. Ptr a -> IO (Ptr a)
throwNull Ptr a
a | Ptr a
a Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr a
forall a. Ptr a
nullPtr = FcException -> IO (Ptr a)
forall e a. Exception e => e -> IO a
throwIO FcException
ErrOOM
    | Bool
otherwise = Ptr a -> IO (Ptr a)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr a
a

-- | Turns a serialized string into a Haskell exception.
throwString :: String -> IO ()
throwString :: String -> IO ()
throwString String
a | Just FcException
b <- String -> Maybe FcException
forall a. Read a => String -> Maybe a
readMaybe String
a :: Maybe FcException = FcException -> IO ()
forall e a. Exception e => e -> IO a
throwIO FcException
b
    | Bool
otherwise = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()