module Rattletrap.Type.Attribute.GameServer where

import qualified Data.Foldable as Foldable
import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Attribute.QWord as QWord
import qualified Rattletrap.Type.Str as Str
import qualified Rattletrap.Utility.Json as Json

data GameServer
  = Old QWord.QWord
  | New Str.Str
  deriving (GameServer -> GameServer -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GameServer -> GameServer -> Bool
$c/= :: GameServer -> GameServer -> Bool
== :: GameServer -> GameServer -> Bool
$c== :: GameServer -> GameServer -> Bool
Eq, Int -> GameServer -> ShowS
[GameServer] -> ShowS
GameServer -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GameServer] -> ShowS
$cshowList :: [GameServer] -> ShowS
show :: GameServer -> String
$cshow :: GameServer -> String
showsPrec :: Int -> GameServer -> ShowS
$cshowsPrec :: Int -> GameServer -> ShowS
Show)

instance Json.FromJSON GameServer where
  parseJSON :: Value -> Parser GameServer
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"GameServer" forall a b. (a -> b) -> a -> b
$ \Object
x ->
    forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
Foldable.asum
      [forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QWord -> GameServer
Old forall a b. (a -> b) -> a -> b
$ forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
x String
"old", forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Str -> GameServer
New forall a b. (a -> b) -> a -> b
$ forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
x String
"new"]

instance Json.ToJSON GameServer where
  toJSON :: GameServer -> Value
toJSON GameServer
x = case GameServer
x of
    Old QWord
y -> [(Key, Value)] -> Value
Json.object [forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"old" forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => a -> Value
Json.toJSON QWord
y]
    New Str
y -> [(Key, Value)] -> Value
Json.object [forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"new" forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => a -> Value
Json.toJSON Str
y]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"attribute-game-server" forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Value] -> Value
Schema.oneOf forall a b. (a -> b) -> a -> b
$
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
      (\(String
k, Value
v) -> [((Key, Value), Bool)] -> Value
Schema.object [(forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
k Value
v, Bool
True)])
      [(String
"old", Schema -> Value
Schema.ref Schema
QWord.schema), (String
"new", Schema -> Value
Schema.ref Schema
Str.schema)]

bitPut :: GameServer -> BitPut.BitPut
bitPut :: GameServer -> BitPut
bitPut GameServer
x = case GameServer
x of
  Old QWord
y -> QWord -> BitPut
QWord.bitPut QWord
y
  New Str
y -> Str -> BitPut
Str.bitPut Str
y

bitGet :: Maybe Str.Str -> BitGet.BitGet GameServer
bitGet :: Maybe Str -> BitGet GameServer
bitGet Maybe Str
buildVersion =
  forall a. String -> BitGet a -> BitGet a
BitGet.label String
"GameServer" forall a b. (a -> b) -> a -> b
$
    if Maybe Str
buildVersion forall a. Ord a => a -> a -> Bool
>= forall a. a -> Maybe a
Just (String -> Str
Str.fromString String
"221120.42953.406184")
      then forall a. String -> BitGet a -> BitGet a
BitGet.label String
"New" forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Str -> GameServer
New BitGet Str
Str.bitGet
      else forall a. String -> BitGet a -> BitGet a
BitGet.label String
"Old" forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QWord -> GameServer
Old BitGet QWord
QWord.bitGet