module Rattletrap.Type.Attribute.StatEvent where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.I32 as I32
import qualified Rattletrap.Utility.Json as Json

data StatEvent = StatEvent
  { StatEvent -> Bool
unknown :: Bool,
    StatEvent -> I32
objectId :: I32.I32
  }
  deriving (StatEvent -> StatEvent -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StatEvent -> StatEvent -> Bool
$c/= :: StatEvent -> StatEvent -> Bool
== :: StatEvent -> StatEvent -> Bool
$c== :: StatEvent -> StatEvent -> Bool
Eq, Int -> StatEvent -> ShowS
[StatEvent] -> ShowS
StatEvent -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StatEvent] -> ShowS
$cshowList :: [StatEvent] -> ShowS
show :: StatEvent -> String
$cshow :: StatEvent -> String
showsPrec :: Int -> StatEvent -> ShowS
$cshowsPrec :: Int -> StatEvent -> ShowS
Show)

instance Json.FromJSON StatEvent where
  parseJSON :: Value -> Parser StatEvent
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"StatEvent" forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
unknown <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown"
    I32
objectId <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"object_id"
    forall (f :: * -> *) a. Applicative f => a -> f a
pure StatEvent {Bool
unknown :: Bool
unknown :: Bool
unknown, I32
objectId :: I32
objectId :: I32
objectId}

instance Json.ToJSON StatEvent where
  toJSON :: StatEvent -> Value
toJSON StatEvent
x =
    [(Key, Value)] -> Value
Json.object
      [forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown" forall a b. (a -> b) -> a -> b
$ StatEvent -> Bool
unknown StatEvent
x, forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"object_id" forall a b. (a -> b) -> a -> b
$ StatEvent -> I32
objectId StatEvent
x]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"attribute-stat-event" forall a b. (a -> b) -> a -> b
$
    [((Key, Value), Bool)] -> Value
Schema.object
      [ (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"object_id" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
I32.schema, Bool
True)
      ]

bitPut :: StatEvent -> BitPut.BitPut
bitPut :: StatEvent -> BitPut
bitPut StatEvent
statEventAttribute =
  Bool -> BitPut
BitPut.bool (StatEvent -> Bool
unknown StatEvent
statEventAttribute)
    forall a. Semigroup a => a -> a -> a
<> I32 -> BitPut
I32.bitPut (StatEvent -> I32
objectId StatEvent
statEventAttribute)

bitGet :: BitGet.BitGet StatEvent
bitGet :: BitGet StatEvent
bitGet = forall a. String -> BitGet a -> BitGet a
BitGet.label String
"StatEvent" forall a b. (a -> b) -> a -> b
$ do
  Bool
unknown <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown" BitGet Bool
BitGet.bool
  I32
objectId <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"objectId" BitGet I32
I32.bitGet
  forall (f :: * -> *) a. Applicative f => a -> f a
pure StatEvent {Bool
unknown :: Bool
unknown :: Bool
unknown, I32
objectId :: I32
objectId :: I32
objectId}