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
(MusicStinger -> MusicStinger -> Bool)
-> (MusicStinger -> MusicStinger -> Bool) -> Eq MusicStinger
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MusicStinger -> MusicStinger -> Bool
== :: MusicStinger -> MusicStinger -> Bool
$c/= :: MusicStinger -> MusicStinger -> Bool
/= :: MusicStinger -> MusicStinger -> Bool
Eq, Int -> MusicStinger -> ShowS
[MusicStinger] -> ShowS
MusicStinger -> String
(Int -> MusicStinger -> ShowS)
-> (MusicStinger -> String)
-> ([MusicStinger] -> ShowS)
-> Show MusicStinger
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MusicStinger -> ShowS
showsPrec :: Int -> MusicStinger -> ShowS
$cshow :: MusicStinger -> String
show :: MusicStinger -> String
$cshowList :: [MusicStinger] -> ShowS
showList :: [MusicStinger] -> ShowS
Show)

instance Json.FromJSON MusicStinger where
  parseJSON :: Value -> Parser MusicStinger
parseJSON = String
-> (Object -> Parser MusicStinger) -> Value -> Parser MusicStinger
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"MusicStinger" ((Object -> Parser MusicStinger) -> Value -> Parser MusicStinger)
-> (Object -> Parser MusicStinger) -> Value -> Parser MusicStinger
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
flag <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"flag"
    U32
cue <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"cue"
    U8
trigger <- Object -> String -> Parser U8
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"trigger"
    MusicStinger -> Parser MusicStinger
forall a. a -> Parser a
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
      [ String -> Bool -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"flag" (Bool -> (Key, Value)) -> Bool -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ MusicStinger -> Bool
flag MusicStinger
x,
        String -> U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"cue" (U32 -> (Key, Value)) -> U32 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ MusicStinger -> U32
cue MusicStinger
x,
        String -> U8 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"trigger" (U8 -> (Key, Value)) -> U8 -> (Key, Value)
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" (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
"flag" (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
"cue" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"trigger" (Value -> (Key, Value)) -> Value -> (Key, Value)
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)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (MusicStinger -> U32
cue MusicStinger
musicStingerAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (MusicStinger -> U8
trigger MusicStinger
musicStingerAttribute)

bitGet :: BitGet.BitGet MusicStinger
bitGet :: BitGet MusicStinger
bitGet = String -> BitGet MusicStinger -> BitGet MusicStinger
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"MusicStinger" (BitGet MusicStinger -> BitGet MusicStinger)
-> BitGet MusicStinger -> BitGet MusicStinger
forall a b. (a -> b) -> a -> b
$ do
  Bool
flag <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"flag" BitGet Bool
BitGet.bool
  U32
cue <- String -> BitGet U32 -> BitGet U32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"cue" BitGet U32
U32.bitGet
  U8
trigger <- String -> BitGet U8 -> BitGet U8
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"trigger" BitGet U8
U8.bitGet
  MusicStinger -> BitGet MusicStinger
forall a. a -> Get BitString Identity a
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}