{-# LANGUAGE OverloadedStrings #-}

module Data.Packer.MessagePack.Internal.Exceptions where

import           Control.Monad
import           Control.Monad.IO.Class
import           Data.Monoid
import           Data.Packer
import           Data.Text
import           Data.Word
import           UnliftIO.Exception

data MsgPackException = MsgPackDeserializationFailure Text
                      | MsgPackSerializationFailure Text
  deriving (Show)

instance Exception MsgPackException

deserializationFailure :: MonadIO m => Text -> m a
deserializationFailure msg =
  throwIO $ MsgPackDeserializationFailure ("Expected " <> msg)

deserializationAssert :: Word8 -> Text -> Unpacking ()
deserializationAssert w msg = do
  w' <- getWord8
  unless (w == w') $
    deserializationFailure msg