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
$c== :: TeamPaint -> TeamPaint -> Bool
== :: TeamPaint -> TeamPaint -> Bool
$c/= :: TeamPaint -> TeamPaint -> Bool
/= :: 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
$cshowsPrec :: Int -> TeamPaint -> ShowS
showsPrec :: Int -> TeamPaint -> ShowS
$cshow :: TeamPaint -> String
show :: TeamPaint -> String
$cshowList :: [TeamPaint] -> ShowS
showList :: [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 a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
      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 =
    [(Key, Value)] -> Value
Json.object
      [ String -> U8 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"team" (U8 -> (Key, Value)) -> U8 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
team TeamPaint
x,
        String -> U8 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"primary_color" (U8 -> (Key, Value)) -> U8 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
primaryColor TeamPaint
x,
        String -> U8 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"accent_color" (U8 -> (Key, Value)) -> U8 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
accentColor TeamPaint
x,
        String -> U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"primary_finish" (U32 -> (Key, Value)) -> U32 -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ TeamPaint -> U32
primaryFinish TeamPaint
x,
        String -> U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"accent_finish" (U32 -> (Key, Value)) -> U32 -> (Key, Value)
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
$
    [((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
"team" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"primary_color" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"accent_color" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"primary_finish" (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
"accent_finish" (Value -> (Key, Value)) -> Value -> (Key, Value)
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 a. a -> Get BitString Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    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
      }