{-# LANGUAGE ScopedTypeVariables #-} module Data.Api.Helper ( parseOrFail ) where import Control.Exception.Safe (MonadThrow, throwM) import Data.Aeson (FromJSON, eitherDecode) import Data.Api.Types import qualified Data.ByteString.Lazy as BSL import qualified Data.Text as T -- | Try to parse any plaid response to appropriate type or fail parseOrFail :: forall b m. ( MonadThrow m , PlaidHttp m , FromJSON b) => BSL.ByteString -> m b parseOrFail bs = do let edecoded = eitherDecode bs :: Either String b case edecoded of Left e -> throwM (PlaidError $ T.pack e) Right decoded -> return decoded