module Rattletrap.Type.Attribute.MusicStinger where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.U32 as U32
import qualified Rattletrap.Type.U8 as U8
import qualified Rattletrap.Utility.Json as Json

data MusicStinger = MusicStinger
  { MusicStinger -> Bool
flag :: Bool,
    MusicStinger -> U32
cue :: U32.U32,
    MusicStinger -> U8
trigger :: U8.U8
  }
  deriving (MusicStinger -> MusicStinger -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MusicStinger -> MusicStinger -> Bool
$c/= :: MusicStinger -> MusicStinger -> Bool
== :: MusicStinger -> MusicStinger -> Bool
$c== :: MusicStinger -> MusicStinger -> Bool
Eq, Int -> MusicStinger -> ShowS
[MusicStinger] -> ShowS
MusicStinger -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MusicStinger] -> ShowS
$cshowList :: [MusicStinger] -> ShowS
show :: MusicStinger -> String
$cshow :: MusicStinger -> String
showsPrec :: Int -> MusicStinger -> ShowS
$cshowsPrec :: Int -> MusicStinger -> ShowS
Show)

instance Json.FromJSON MusicStinger where
  parseJSON :: Value -> Parser MusicStinger
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"MusicStinger" forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
flag <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"flag"
    U32
cue <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"cue"
    U8
trigger <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"trigger"
    forall (f :: * -> *) a. Applicative f => a -> f a
pure MusicStinger {Bool
flag :: Bool
flag :: Bool
flag, U32
cue :: U32
cue :: U32
cue, U8
trigger :: U8
trigger :: U8
trigger}

instance Json.ToJSON MusicStinger where
  toJSON :: MusicStinger -> Value
toJSON MusicStinger
x =
    [(Key, Value)] -> Value
Json.object
      [ forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"flag" forall a b. (a -> b) -> a -> b
$ MusicStinger -> Bool
flag MusicStinger
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"cue" forall a b. (a -> b) -> a -> b
$ MusicStinger -> U32
cue MusicStinger
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"trigger" forall a b. (a -> b) -> a -> b
$ MusicStinger -> U8
trigger MusicStinger
x
      ]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"attribute-music-stinger" 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
"flag" 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
"cue" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"trigger" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
      ]

bitPut :: MusicStinger -> BitPut.BitPut
bitPut :: MusicStinger -> BitPut
bitPut MusicStinger
musicStingerAttribute =
  Bool -> BitPut
BitPut.bool (MusicStinger -> Bool
flag MusicStinger
musicStingerAttribute)
    forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (MusicStinger -> U32
cue MusicStinger
musicStingerAttribute)
    forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (MusicStinger -> U8
trigger MusicStinger
musicStingerAttribute)

bitGet :: BitGet.BitGet MusicStinger
bitGet :: BitGet MusicStinger
bitGet = forall a. String -> BitGet a -> BitGet a
BitGet.label String
"MusicStinger" forall a b. (a -> b) -> a -> b
$ do
  Bool
flag <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"flag" BitGet Bool
BitGet.bool
  U32
cue <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"cue" BitGet U32
U32.bitGet
  U8
trigger <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"trigger" BitGet U8
U8.bitGet
  forall (f :: * -> *) a. Applicative f => a -> f a
pure MusicStinger {Bool
flag :: Bool
flag :: Bool
flag, U32
cue :: U32
cue :: U32
cue, U8
trigger :: U8
trigger :: U8
trigger}