packages feed

rattletrap-14.0.0: src/lib/Rattletrap/Type/Property.hs

module Rattletrap.Type.Property where

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

data Property = Property
  { kind :: Str.Str,
    -- | Not used.
    size :: U32.U32,
    index :: U32.U32,
    value :: PropertyValue.PropertyValue Property
  }
  deriving (Eq, Show)

instance Json.FromJSON Property where
  parseJSON = Json.withObject "Property" $ \object -> do
    kind <- Json.required object "kind"
    size <- Json.required object "size"
    index <- Json.required object "index"
    value <- Json.required object "value"
    pure Property {kind, size, index, value}

instance Json.ToJSON Property where
  toJSON x =
    Json.object
      [ Json.pair "kind" $ kind x,
        Json.pair "size" $ size x,
        Json.pair "index" $ index x,
        Json.pair "value" $ value x
      ]

schema :: Schema.Schema
schema =
  Schema.named "property" $
    Schema.object
      [ (Json.pair "kind" $ Schema.ref Str.schema, True),
        (Json.pair "size" $ Schema.ref U32.schema, True),
        (Json.pair "index" $ Schema.ref U32.schema, True),
        (Json.pair "value" . Schema.ref $ PropertyValue.schema schema, True)
      ]

bytePut :: Property -> BytePut.BytePut
bytePut x =
  Str.bytePut (kind x)
    <> U32.bytePut (size x)
    <> U32.bytePut (index x)
    <> PropertyValue.bytePut
      bytePut
      (value x)

byteGet :: ByteGet.ByteGet Property
byteGet = ByteGet.label "Property" $ do
  kind <- ByteGet.label "kind" Str.byteGet
  size <- ByteGet.label "size" U32.byteGet
  index <- ByteGet.label "index" U32.byteGet
  value <- ByteGet.label "value" $ PropertyValue.byteGet byteGet kind
  pure Property {kind, size, index, value}