packages feed

binrep-0.3.0: src/Haskpatch/Format/Vcdiff.hs

-- | https://datatracker.ietf.org/doc/html/rfc3284

module Haskpatch.Format.Vcdiff where

import Binrep.Type.Magic
import Binrep.Type.Varint
import Binrep.Type.Common
import Strongweak

import Numeric.Natural
import Data.ByteString ( ByteString )
import Data.Word ( Word8 )

data Vcdiff (s :: Strength) = Vcdiff
  { vcdiffHeader :: Header s
  }

data Header (s :: Strength) = Header
  { headerMagic :: SW s (Magic '[0xD6, 0xC3, 0xC4, 0x00])
  -- ^ First 3 bytes are @VCD@ each with their MSB on.

  , headerIndicator :: SW s (Magic '[0x00])
  -- ^ TODO annoying and impacts rest of format. forcing to 0x00 to simplify
  }

data Window (s :: Strength) = Window
  { windowIndicator :: SW s (Magic '[0x00]) -- TODO
  , windowDelta :: Delta s
  }

data Delta (s :: Strength) = Delta
  { deltaIndicator :: SW s (Magic '[0x00]) -- TODO compression indicators. ignoring
  , deltaAddRun :: ByteString
  , deltaInstrs :: [InstrCode]
  , deltaCopy   :: ByteString
  }

data InstrCode = InstrCode
  { instrCodeTriple1 :: InstrTriple
  , instrCodeTriple2 :: InstrTriple
  }

data InstrTriple = InstrTriple
  { instrTripleInstr :: Instr

  , instrTripleSize  :: Word8

  , instrTripleMode  :: Word8
  -- ^ 0 and meaningless unless instr is a COPY
  }

-- TODO singletons it
data Instr = Instr0Noop | Instr1Add | Instr2Run | Instr3Copy

-- | Apparently from the Sfio library, also similar (but not identical) to BPS's
--   varints.
type VcdiffVarint = Varnat 'Redundant 'OnContinues 'BE Natural