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
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
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 = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"TeamPaint" forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    U8
team <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"team"
    U8
primaryColor <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"primary_color"
    U8
accentColor <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"accent_color"
    U32
primaryFinish <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"primary_finish"
    U32
accentFinish <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"accent_finish"
    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
      [ forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"team" forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
team TeamPaint
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_color" forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
primaryColor TeamPaint
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_color" forall a b. (a -> b) -> a -> b
$ TeamPaint -> U8
accentColor TeamPaint
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_finish" forall a b. (a -> b) -> a -> b
$ TeamPaint -> U32
primaryFinish TeamPaint
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_finish" 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" 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
"team" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_color" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"accent_color" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"primary_finish" 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
"accent_finish" 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)
    forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (TeamPaint -> U8
primaryColor TeamPaint
teamPaintAttribute)
    forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (TeamPaint -> U8
accentColor TeamPaint
teamPaintAttribute)
    forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (TeamPaint -> U32
primaryFinish TeamPaint
teamPaintAttribute)
    forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (TeamPaint -> U32
accentFinish TeamPaint
teamPaintAttribute)

bitGet :: BitGet.BitGet TeamPaint
bitGet :: BitGet TeamPaint
bitGet = forall a. String -> BitGet a -> BitGet a
BitGet.label String
"TeamPaint" forall a b. (a -> b) -> a -> b
$ do
  U8
team <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"team" BitGet U8
U8.bitGet
  U8
primaryColor <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"primaryColor" BitGet U8
U8.bitGet
  U8
accentColor <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"accentColor" BitGet U8
U8.bitGet
  U32
primaryFinish <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"primaryFinish" BitGet U32
U32.bitGet
  U32
accentFinish <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"accentFinish" BitGet U32
U32.bitGet
  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
      }