module Rattletrap.Type.Attribute.ClubColors where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.U8 as U8
import qualified Rattletrap.Utility.Json as Json

data ClubColors = ClubColors
  { ClubColors -> Bool
blueFlag :: Bool,
    ClubColors -> U8
blueColor :: U8.U8,
    ClubColors -> Bool
orangeFlag :: Bool,
    ClubColors -> U8
orangeColor :: U8.U8
  }
  deriving (ClubColors -> ClubColors -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ClubColors -> ClubColors -> Bool
$c/= :: ClubColors -> ClubColors -> Bool
== :: ClubColors -> ClubColors -> Bool
$c== :: ClubColors -> ClubColors -> Bool
Eq, Int -> ClubColors -> ShowS
[ClubColors] -> ShowS
ClubColors -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ClubColors] -> ShowS
$cshowList :: [ClubColors] -> ShowS
show :: ClubColors -> String
$cshow :: ClubColors -> String
showsPrec :: Int -> ClubColors -> ShowS
$cshowsPrec :: Int -> ClubColors -> ShowS
Show)

instance Json.FromJSON ClubColors where
  parseJSON :: Value -> Parser ClubColors
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"ClubColors" forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
blueFlag <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"blue_flag"
    U8
blueColor <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"blue_color"
    Bool
orangeFlag <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"orange_flag"
    U8
orangeColor <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"orange_color"
    forall (f :: * -> *) a. Applicative f => a -> f a
pure ClubColors {Bool
blueFlag :: Bool
blueFlag :: Bool
blueFlag, U8
blueColor :: U8
blueColor :: U8
blueColor, Bool
orangeFlag :: Bool
orangeFlag :: Bool
orangeFlag, U8
orangeColor :: U8
orangeColor :: U8
orangeColor}

instance Json.ToJSON ClubColors where
  toJSON :: ClubColors -> Value
toJSON ClubColors
x =
    [(Key, Value)] -> Value
Json.object
      [ forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"blue_flag" forall a b. (a -> b) -> a -> b
$ ClubColors -> Bool
blueFlag ClubColors
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"blue_color" forall a b. (a -> b) -> a -> b
$ ClubColors -> U8
blueColor ClubColors
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"orange_flag" forall a b. (a -> b) -> a -> b
$ ClubColors -> Bool
orangeFlag ClubColors
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"orange_color" forall a b. (a -> b) -> a -> b
$ ClubColors -> U8
orangeColor ClubColors
x
      ]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"attribute-club-colors" 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
"blue_flag" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"blue_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
"orange_flag" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"orange_color" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
      ]

bitPut :: ClubColors -> BitPut.BitPut
bitPut :: ClubColors -> BitPut
bitPut ClubColors
clubColorsAttribute =
  Bool -> BitPut
BitPut.bool (ClubColors -> Bool
blueFlag ClubColors
clubColorsAttribute)
    forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (ClubColors -> U8
blueColor ClubColors
clubColorsAttribute)
    forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (ClubColors -> Bool
orangeFlag ClubColors
clubColorsAttribute)
    forall a. Semigroup a => a -> a -> a
<> U8 -> BitPut
U8.bitPut (ClubColors -> U8
orangeColor ClubColors
clubColorsAttribute)

bitGet :: BitGet.BitGet ClubColors
bitGet :: BitGet ClubColors
bitGet = forall a. String -> BitGet a -> BitGet a
BitGet.label String
"ClubColors" forall a b. (a -> b) -> a -> b
$ do
  Bool
blueFlag <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"blueFlag" BitGet Bool
BitGet.bool
  U8
blueColor <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"blueColor" BitGet U8
U8.bitGet
  Bool
orangeFlag <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"orangeFlag" BitGet Bool
BitGet.bool
  U8
orangeColor <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"orangeColor" BitGet U8
U8.bitGet
  forall (f :: * -> *) a. Applicative f => a -> f a
pure ClubColors {Bool
blueFlag :: Bool
blueFlag :: Bool
blueFlag, U8
blueColor :: U8
blueColor :: U8
blueColor, Bool
orangeFlag :: Bool
orangeFlag :: Bool
orangeFlag, U8
orangeColor :: U8
orangeColor :: U8
orangeColor}