module Data.Bond.Internal.ProtoUtils where

import Data.Bond.Schema.ProtocolType

import Data.Bits
import Data.Word
import qualified Data.ByteString.Lazy as BL

parseHeader :: BL.ByteString -> (ProtocolType, Word16)
parseHeader s | BL.length s /= 4 = (ProtocolType maxBound, maxBound)
parseHeader s = (protoSig, protoVer)
    where
    [s0, s1, v0, v1] = BL.unpack $ BL.take 4 s
    protoSig = ProtocolType $ fromIntegral s0 .|. (fromIntegral s1 `shiftL` 8)
    protoVer = fromIntegral v0 .|. (fromIntegral v1 `shiftL` 8)

protoHeader :: ProtocolType -> Word16 -> BL.ByteString
protoHeader (ProtocolType protoSig) protoVer = BL.pack [s0, s1, v0, v1]
    where
    s0 = fromIntegral protoSig
    s1 = fromIntegral (protoSig `shiftR` 8)
    v0 = fromIntegral protoVer
    v1 = fromIntegral (protoVer `shiftR` 8)