-- | Utilities for @Data.Binary@.

module Serokell.Util.Binary
       ( decodeFull
       ) where

import           Data.Binary (Binary, decodeOrFail)
import qualified Data.ByteString.Lazy as BSL
import           Data.ByteString.Lazy (ByteString)

-- | Like 'decode', but ensures that the whole input has been consumed.
decodeFull :: Binary a => ByteString -> Either String a
decodeFull bs = case decodeOrFail bs of
    Left (_, _, err) -> Left ("decodeFull: " ++ err)
    Right (unconsumed, _, a)
        | BSL.null unconsumed -> Right a
        | otherwise -> Left "decodeFull: unconsumed input"