{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
module Language.C.Inline.Cpp.Exceptions {-# DEPRECATED "Language.C.Inline.Cpp.Exceptions is deprecated in favor of Language.C.Inline.Cpp.Exception which changes the CppException data type to preserve the exception for custom error handling." #-} (
    CppException(CppHaskellException)
  , pattern Language.C.Inline.Cpp.Exceptions.CppStdException
  , pattern Language.C.Inline.Cpp.Exceptions.CppOtherException
  , toSomeException
  , throwBlock
  , tryBlock
  , catchBlock
  ) where


import           Data.ByteString (ByteString)
import qualified Data.Text.Encoding as T
import qualified Data.Text.Encoding.Error as T
import qualified Data.Text as T
import           Language.C.Inline.Cpp.Exception

bsToChars :: ByteString -> String
bsToChars :: ByteString -> String
bsToChars = Text -> String
T.unpack (Text -> String) -> (ByteString -> Text) -> ByteString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OnDecodeError -> ByteString -> Text
T.decodeUtf8With OnDecodeError
T.lenientDecode

cppStdExceptionMessage :: CppException -> Maybe String
cppStdExceptionMessage :: CppException -> Maybe String
cppStdExceptionMessage (Language.C.Inline.Cpp.Exception.CppStdException CppExceptionPtr
_ ByteString
s (Just ByteString
t)) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"Exception: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ByteString -> String
bsToChars ByteString
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"; type: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ByteString -> String
bsToChars ByteString
t
cppStdExceptionMessage (Language.C.Inline.Cpp.Exception.CppStdException CppExceptionPtr
_ ByteString
s Maybe ByteString
Nothing) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"Exception: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> ByteString -> String
bsToChars ByteString
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"; type: not available (please use g++ or clang)"
cppStdExceptionMessage CppException
_ = Maybe String
forall a. Maybe a
Nothing

cppNonStdExceptionType :: CppException -> Maybe (Maybe String)
cppNonStdExceptionType :: CppException -> Maybe (Maybe String)
cppNonStdExceptionType (CppNonStdException CppExceptionPtr
_ Maybe ByteString
mt) = Maybe String -> Maybe (Maybe String)
forall a. a -> Maybe a
Just ((ByteString -> String) -> Maybe ByteString -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ByteString -> String
bsToChars Maybe ByteString
mt)
cppNonStdExceptionType CppException
_ = Maybe (Maybe String)
forall a. Maybe a
Nothing

pattern CppStdException :: String -> CppException
pattern $mCppStdException :: forall r. CppException -> (String -> r) -> (Void# -> r) -> r
CppStdException s <- (cppStdExceptionMessage -> Just s)

pattern CppOtherException :: Maybe String -> CppException
pattern $mCppOtherException :: forall r. CppException -> (Maybe String -> r) -> (Void# -> r) -> r
CppOtherException mt <- (cppNonStdExceptionType -> Just mt)