module Rattletrap.Type.Attribute.TeamPaint 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 TeamPaint = TeamPaint
  { TeamPaint -> U8
team :: U8.U8
  , TeamPaint -> U8
primaryColor :: U8.U8
  , TeamPaint -> U8
accentColor :: U8.U8
  , TeamPaint -> U32
primaryFinish :: U32.U32
  , TeamPaint -> U32
accentFinish :: U32.U32
  }
  deriving (TeamPaint -> TeamPaint -> Bool
(TeamPaint -> TeamPaint -> Bool)
-> (TeamPaint -> TeamPaint -> Bool) -> Eq TeamPaint
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TeamPaint -> TeamPaint -> Bool
$c/= :: TeamPaint -> TeamPaint -> Bool
== :: TeamPaint -> TeamPaint -> Bool
$c== :: TeamPaint -> TeamPaint -> Bool
Eq, Int -> TeamPaint -> ShowS
[TeamPaint] -> ShowS
TeamPaint -> String
(Int -> TeamPaint -> ShowS)
-> (TeamPaint -> String)
-> ([TeamPaint] -> ShowS)
-> Show TeamPaint
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TeamPaint] -> ShowS
$cshowList :: [TeamPaint] -> ShowS
show :: TeamPaint -> String
$cshow :: TeamPaint -> String
showsPrec :: Int -> TeamPaint -> ShowS
$cshowsPrec :: Int -> TeamPaint -> ShowS
Show)

instance Json.FromJSON TeamPaint where
  parseJSON :: Value -> Parser TeamPaint
parseJSON = String -> (Object -> Parser TeamPaint) -> Value -> Parser TeamPaint
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"TeamPaint" ((Object -> Parser TeamPaint) -> Value -> Parser TeamPaint)
-> (Object -> Parser TeamPaint) -> Value -> Parser TeamPaint
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    U8
team <- Object -> String -> Parser U8
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"team"
    U8
primaryColor <- Object -> String -> Parser U8
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"primary_color"
    U8
accentColor <- Object -> String -> Parser U8
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"accent_color"
    U32
primaryFinish <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"primary_finish"
    U32
accentFinish <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"accent_finish"
    TeamPaint -> Parser TeamPaint
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamPaint :: U8 -> U8 -> U8 -> U32 -> U32 -> TeamPaint
TeamPaint
      { U8
team :: U8
team :: U8
team
      , U8
primaryColor :: U8
primaryColor :: U8
primaryColor
      , U8
accentColor :: U8
accentColor :: U8
accentColor
      , U32
primaryFinish :: U32
primaryFinish :: U32
primaryFinish
      , U32
accentFinish :: U32
accentFinish :: U32
accentFinish
      }

instance Json.ToJSON TeamPaint where
  toJSON :: TeamPaint -> Value
toJSON TeamPaint
x = [Pair] -> Value
Json.object
    [ String -> U8 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"team" (U8 -> Pair) -> U8 -> Pair
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
team TeamPaint
x
    , String -> U8 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_color" (U8 -> Pair) -> U8 -> Pair
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
primaryColor TeamPaint
x
    , String -> U8 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_color" (U8 -> Pair) -> U8 -> Pair
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
accentColor TeamPaint
x
    , String -> U32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_finish" (U32 -> Pair) -> U32 -> Pair
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U32
primaryFinish TeamPaint
x
    , String -> U32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_finish" (U32 -> Pair) -> U32 -> Pair
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U32
accentFinish TeamPaint
x
    ]

schema :: Schema.Schema
schema :: Schema
schema = String -> Value -> Schema
Schema.named String
"attribute-team-paint" (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
"team" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_color" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_color" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_finish" (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
"accent_finish" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True)
  ]

bitPut :: TeamPaint -> BitPut.BitPut
bitPut :: TeamPaint -> BitPut
bitPut TeamPaint
teamPaintAttribute =
  U8 -> BitPut
U8.bitPut (TeamPaint -> U8
team TeamPaint
teamPaintAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (TeamPaint -> U8
primaryColor TeamPaint
teamPaintAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (TeamPaint -> U8
accentColor TeamPaint
teamPaintAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (TeamPaint -> U32
primaryFinish TeamPaint
teamPaintAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (TeamPaint -> U32
accentFinish TeamPaint
teamPaintAttribute)

bitGet :: BitGet.BitGet TeamPaint
bitGet :: BitGet TeamPaint
bitGet = String -> BitGet TeamPaint -> BitGet TeamPaint
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"TeamPaint" (BitGet TeamPaint -> BitGet TeamPaint)
-> BitGet TeamPaint -> BitGet TeamPaint
forall a b. (a -> b) -> a -> b
$ do
  U8
team <- String -> BitGet U8 -> BitGet U8
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"team" BitGet U8
U8.bitGet
  U8
primaryColor <- String -> BitGet U8 -> BitGet U8
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"primaryColor" BitGet U8
U8.bitGet
  U8
accentColor <- String -> BitGet U8 -> BitGet U8
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"accentColor" BitGet U8
U8.bitGet
  U32
primaryFinish <- String -> BitGet U32 -> BitGet U32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"primaryFinish" BitGet U32
U32.bitGet
  U32
accentFinish <- String -> BitGet U32 -> BitGet U32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"accentFinish" BitGet U32
U32.bitGet
  TeamPaint -> BitGet TeamPaint
forall (f :: * -> *) a. Applicative f => a -> f a
pure TeamPaint :: U8 -> U8 -> U8 -> U32 -> U32 -> TeamPaint
TeamPaint
    { U8
team :: U8
team :: U8
team
    , U8
primaryColor :: U8
primaryColor :: U8
primaryColor
    , U8
accentColor :: U8
accentColor :: U8
accentColor
    , U32
primaryFinish :: U32
primaryFinish :: U32
primaryFinish
    , U32
accentFinish :: U32
accentFinish :: U32
accentFinish
    }