rattletrap-0.1.0: library/Rattletrap/RemoteId.hs
module Rattletrap.RemoteId where
import Rattletrap.Word64
import Rattletrap.Word8
import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit
import qualified Data.ByteString.Lazy as ByteString
import qualified Data.Word as Word
data RemoteId
= PlayStationId [Word.Word8]
| SplitscreenId [Word.Word8]
| SteamId Word64
| XboxId Word64
deriving (Eq, Ord, Show)
getRemoteId :: Word8 -> BinaryBit.BitGet RemoteId
getRemoteId systemId =
case word8Value systemId of
0 -> do
bytes <- BinaryBit.getLazyByteString 3
pure (SplitscreenId (ByteString.unpack bytes))
1 -> do
word64 <- getWord64Bits
pure (SteamId word64)
2 -> do
bytes <- BinaryBit.getLazyByteString 32
pure (PlayStationId (ByteString.unpack bytes))
4 -> do
word64 <- getWord64Bits
pure (XboxId word64)
_ -> fail ("unknown system id " ++ show systemId)
putRemoteId :: RemoteId -> BinaryBit.BitPut ()
putRemoteId remoteId =
case remoteId of
PlayStationId bytes ->
BinaryBit.putByteString (ByteString.toStrict (ByteString.pack bytes))
SplitscreenId bytes ->
BinaryBit.putByteString (ByteString.toStrict (ByteString.pack bytes))
SteamId word64 -> putWord64Bits word64
XboxId word64 -> putWord64Bits word64