packages feed

rws-0.1.1.2: src/Payload.hs

module Payload where

import Data.Binary.Put
import qualified Data.ByteString.Lazy as B
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Perm

import Packet
import Lexer
import Util

payloadPkt :: Parser Packet -> Parser Payload
payloadPkt _ = permute
  (tuple <$?> (0, parseIntAttribute "pattern")
         <|?> (64, parseIntAttribute "length"))
  where
    tuple = Payload

payloadDecl :: Parser Packet -> Parser Packet
payloadDecl f = do
  symbol "payload"
  p <- payloadPkt f
  return (PPayload p)

payloadWrite :: Payload -> Put
payloadWrite p = do
  let bs = B.replicate (fromIntegral $ payloadLength p)
                        (fromIntegral $ payloadPattern p)
  putLazyByteString bs

instance PacketWriteable Payload where packetWrite p _ _ = payloadWrite p