content: module Rattletrap.Type.AttributeMapping where
  
  import qualified Rattletrap.ByteGet as ByteGet
  import qualified Rattletrap.BytePut as BytePut
  import qualified Rattletrap.Schema as Schema
  import qualified Rattletrap.Type.U32 as U32
  import qualified Rattletrap.Utility.Json as Json
  
  data AttributeMapping = AttributeMapping
    { objectId :: U32.U32,
      streamId :: U32.U32
    }
    deriving (Eq, Show)
  
  instance Json.FromJSON AttributeMapping where
    parseJSON = Json.withObject "AttributeMapping" $ \object -> do
      objectId <- Json.required object "object_id"
      streamId <- Json.required object "stream_id"
      pure AttributeMapping {objectId, streamId}
  
  instance Json.ToJSON AttributeMapping where
    toJSON x =
      Json.object
        [Json.pair "object_id" $ objectId x, Json.pair "stream_id" $ streamId x]
  
  schema :: Schema.Schema
  schema =
    Schema.named "attributeMapping" $
      Schema.object
        [ (Json.pair "object_id" $ Schema.ref U32.schema, True),
          (Json.pair "stream_id" $ Schema.ref U32.schema, True)
        ]
  
  bytePut :: AttributeMapping -> BytePut.BytePut
  bytePut x = U32.bytePut (objectId x) <> U32.bytePut (streamId x)
  
  byteGet :: ByteGet.ByteGet AttributeMapping
  byteGet = ByteGet.label "AttributeMapping" $ do
    objectId <- ByteGet.label "objectId" U32.byteGet
    streamId <- ByteGet.label "streamId" U32.byteGet
    pure AttributeMapping {objectId, streamId}
  