module Rattletrap.Type.ObjectTarget 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 ObjectTarget = ObjectTarget
  { ObjectTarget -> Bool
isActor :: Bool,
    ObjectTarget -> I32
targetIndex :: I32.I32
  }
  deriving (ObjectTarget -> ObjectTarget -> Bool
(ObjectTarget -> ObjectTarget -> Bool)
-> (ObjectTarget -> ObjectTarget -> Bool) -> Eq ObjectTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ObjectTarget -> ObjectTarget -> Bool
== :: ObjectTarget -> ObjectTarget -> Bool
$c/= :: ObjectTarget -> ObjectTarget -> Bool
/= :: ObjectTarget -> ObjectTarget -> Bool
Eq, Int -> ObjectTarget -> ShowS
[ObjectTarget] -> ShowS
ObjectTarget -> String
(Int -> ObjectTarget -> ShowS)
-> (ObjectTarget -> String)
-> ([ObjectTarget] -> ShowS)
-> Show ObjectTarget
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ObjectTarget -> ShowS
showsPrec :: Int -> ObjectTarget -> ShowS
$cshow :: ObjectTarget -> String
show :: ObjectTarget -> String
$cshowList :: [ObjectTarget] -> ShowS
showList :: [ObjectTarget] -> ShowS
Show)

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

instance Json.ToJSON ObjectTarget where
  toJSON :: ObjectTarget -> Value
toJSON ObjectTarget
x =
    [(Key, Value)] -> Value
Json.object
      [ String -> Bool -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"is_actor" (Bool -> (Key, Value)) -> Bool -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ ObjectTarget -> Bool
isActor ObjectTarget
x,
        String -> I32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"target_index" (I32 -> (Key, Value)) -> I32 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ ObjectTarget -> I32
targetIndex ObjectTarget
x
      ]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"object-target" (Value -> Schema) -> Value -> Schema
forall a b. (a -> b) -> a -> b
$
    [((Key, Value), Bool)] -> Value
Schema.object
      [ (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"is_actor" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"target_index" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
I32.schema, Bool
True)
      ]

bitPut :: ObjectTarget -> BitPut.BitPut
bitPut :: ObjectTarget -> BitPut
bitPut ObjectTarget
demolishAttribute =
  Bool -> BitPut
BitPut.bool (ObjectTarget -> Bool
isActor ObjectTarget
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> I32 -> BitPut
I32.bitPut (ObjectTarget -> I32
targetIndex ObjectTarget
demolishAttribute)

bitGet :: BitGet.BitGet ObjectTarget
bitGet :: BitGet ObjectTarget
bitGet = String -> BitGet ObjectTarget -> BitGet ObjectTarget
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"ObjectTarget" (BitGet ObjectTarget -> BitGet ObjectTarget)
-> BitGet ObjectTarget -> BitGet ObjectTarget
forall a b. (a -> b) -> a -> b
$ do
  Bool
isActor <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"isActor" BitGet Bool
BitGet.bool
  I32
targetIndex <- String -> BitGet I32 -> BitGet I32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"targetIndex" BitGet I32
I32.bitGet
  ObjectTarget -> BitGet ObjectTarget
forall a. a -> Get BitString Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    ObjectTarget
      { Bool
isActor :: Bool
isActor :: Bool
isActor,
        I32
targetIndex :: I32
targetIndex :: I32
targetIndex
      }