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
/= :: MusicStinger -> MusicStinger -> Bool
$c/= :: MusicStinger -> MusicStinger -> Bool
== :: MusicStinger -> MusicStinger -> Bool
$c== :: 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
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 = 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 (f :: * -> *) a. Applicative f => a -> f a
pure MusicStinger :: Bool -> U32 -> U8 -> MusicStinger
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 = [Pair] -> Value
Json.object
    [ String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"flag" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ MusicStinger -> Bool
flag MusicStinger
x
    , String -> U32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"cue" (U32 -> Pair) -> U32 -> Pair
forall a b. (a -> b) -> a -> b
$ MusicStinger -> U32
cue MusicStinger
x
    , String -> U8 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"trigger" (U8 -> Pair) -> U8 -> Pair
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
$ [(Pair, Bool)] -> Value
Schema.object
  [ (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"flag" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"cue" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"trigger" (Value -> Pair) -> Value -> Pair
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 = Bool -> U32 -> U8 -> MusicStinger
MusicStinger (Bool -> U32 -> U8 -> MusicStinger)
-> BitGet Bool -> BitGet (U32 -> U8 -> MusicStinger)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BitGet Bool
BitGet.bool BitGet (U32 -> U8 -> MusicStinger)
-> BitGet U32 -> BitGet (U8 -> MusicStinger)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BitGet U32
U32.bitGet BitGet (U8 -> MusicStinger) -> BitGet U8 -> BitGet MusicStinger
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BitGet U8
U8.bitGet