packages feed

rattletrap-14.1.4: src/lib/Rattletrap/Type/Mark.hs

module Rattletrap.Type.Mark where

import qualified Rattletrap.ByteGet as ByteGet
import qualified Rattletrap.BytePut as BytePut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Str as Str
import qualified Rattletrap.Type.U32 as U32
import qualified Rattletrap.Utility.Json as Json

data Mark = Mark
  { -- | Which type of mark this is, like @Team0Goal@.
    value :: Str.Str,
    -- | Which frame this mark belongs to, starting from 0.
    frame :: U32.U32
  }
  deriving (Eq, Show)

instance Json.FromJSON Mark where
  parseJSON = Json.withObject "Mark" $ \object -> do
    value <- Json.required object "value"
    frame <- Json.required object "frame"
    pure Mark {value, frame}

instance Json.ToJSON Mark where
  toJSON x =
    Json.object [Json.pair "value" $ value x, Json.pair "frame" $ frame x]

schema :: Schema.Schema
schema =
  Schema.named "mark" $
    Schema.object
      [ (Json.pair "value" $ Schema.ref Str.schema, True),
        (Json.pair "frame" $ Schema.ref U32.schema, True)
      ]

bytePut :: Mark -> BytePut.BytePut
bytePut x = Str.bytePut (value x) <> U32.bytePut (frame x)

byteGet :: ByteGet.ByteGet Mark
byteGet = ByteGet.label "Mark" $ do
  value <- ByteGet.label "value" Str.byteGet
  frame <- ByteGet.label "frame" U32.byteGet
  pure Mark {value, frame}