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