-- | BERP (BERT packets) support.
module Data.BERT.Packet
  ( Packet(..)
  , fromPacket
  ) where

import Control.Monad
import Data.ByteString.Lazy as L
import Data.Binary
import Data.Binary.Put
import Data.Binary.Get

import Data.BERT.Term ()
import Data.BERT.Types

-- | A single BERP. Little more than a wrapper for a term.
data Packet
  = Packet Term
    deriving (Show, Ord, Eq)

fromPacket (Packet t) = t

instance Binary Packet where
  put (Packet term) =
    putWord32be (fromIntegral len) >> putLazyByteString encoded
    where encoded = encode term
          len     = L.length encoded

  get = getPacket

getPacket =
  liftM fromIntegral getWord32be >>=
  getLazyByteString              >>=
  return . Packet . decode