module Database.SQLite.SimpleErrors
(
DatabaseResponse
, runDBAction
) where
import Control.Exception
import Database.SQLite.Simple (FormatError, ResultError, SQLError)
import Database.SQLite.SimpleErrors.Types
import Database.SQLite.SimpleErrors.Parser
type DatabaseResponse a = Either SQLiteResponse a
runDBAction :: IO a -> IO (DatabaseResponse a)
runDBAction sqlAction = do
res <- try sqlAction
case res of
(Left e) -> return . Left $! convertException e
(Right e) -> return $ Right e
convertException :: SomeException -> SQLiteResponse
convertException se = handleResultError se $ fromException se
handleResultError :: SomeException -> Maybe ResultError -> SQLiteResponse
handleResultError se Nothing = handleFormatError se (fromException se)
handleResultError _ (Just e) = SQLResultError e
handleFormatError :: SomeException -> Maybe FormatError -> SQLiteResponse
handleFormatError se Nothing = handleSQLError se (fromException se)
handleFormatError _ (Just e) = SQLFormatError e
handleSQLError :: SomeException -> Maybe SQLError -> SQLiteResponse
handleSQLError se Nothing = throw se
handleSQLError _ (Just e) = receiveSQLError e