module Rattletrap.Type.Header where
import qualified Rattletrap.ByteGet as ByteGet
import qualified Rattletrap.BytePut as BytePut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Dictionary as Dictionary
import qualified Rattletrap.Type.Property as Property
import qualified Rattletrap.Type.Str as Str
import qualified Rattletrap.Type.U32 as U32
import qualified Rattletrap.Type.Version as Version
import qualified Rattletrap.Utility.Json as Json
data =
{ Header -> Version
version :: Version.Version,
Header -> Str
label :: Str.Str,
Header -> Dictionary Property
properties :: Dictionary.Dictionary Property.Property
}
deriving (Header -> Header -> Bool
(Header -> Header -> Bool)
-> (Header -> Header -> Bool) -> Eq Header
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Header -> Header -> Bool
== :: Header -> Header -> Bool
$c/= :: Header -> Header -> Bool
/= :: Header -> Header -> Bool
Eq, Int -> Header -> ShowS
[Header] -> ShowS
Header -> String
(Int -> Header -> ShowS)
-> (Header -> String) -> ([Header] -> ShowS) -> Show Header
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Header -> ShowS
showsPrec :: Int -> Header -> ShowS
$cshow :: Header -> String
show :: Header -> String
$cshowList :: [Header] -> ShowS
showList :: [Header] -> ShowS
Show)
instance Json.FromJSON Header where
parseJSON :: Value -> Parser Header
parseJSON = String -> (Object -> Parser Header) -> Value -> Parser Header
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"Header" ((Object -> Parser Header) -> Value -> Parser Header)
-> (Object -> Parser Header) -> Value -> Parser Header
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
major <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"engine_version"
minor <- Json.required object "licensee_version"
patch <- Json.optional object "patch_version"
label <- Json.required object "label"
properties <- Json.required object "properties"
pure
Header
{ version =
Version.Version
{ Version.major,
Version.minor,
Version.patch
},
label,
properties
}
instance Json.ToJSON Header where
toJSON :: Header -> Value
toJSON Header
x =
[(Key, Value)] -> Value
Json.object
[ String -> U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"engine_version" (U32 -> (Key, Value))
-> (Version -> U32) -> Version -> (Key, Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> U32
Version.major (Version -> (Key, Value)) -> Version -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Header -> Version
version Header
x,
String -> U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"licensee_version" (U32 -> (Key, Value))
-> (Version -> U32) -> Version -> (Key, Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> U32
Version.minor (Version -> (Key, Value)) -> Version -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Header -> Version
version Header
x,
String -> Maybe U32 -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"patch_version" (Maybe U32 -> (Key, Value))
-> (Version -> Maybe U32) -> Version -> (Key, Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Maybe U32
Version.patch (Version -> (Key, Value)) -> Version -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Header -> Version
version Header
x,
String -> Str -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"label" (Str -> (Key, Value)) -> Str -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Header -> Str
label Header
x,
String -> Dictionary Property -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"properties" (Dictionary Property -> (Key, Value))
-> Dictionary Property -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Header -> Dictionary Property
properties Header
x
]
schema :: Schema.Schema
schema :: Schema
schema =
String -> Value -> Schema
Schema.named String
"header" (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
"engine_version" (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
"licensee_version" (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
"patch_version" (Value -> (Key, Value))
-> (Schema -> Value) -> Schema -> (Key, Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Value
Schema.json (Schema -> (Key, Value)) -> Schema -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Schema
Schema.maybe Schema
U32.schema, Bool
False),
(String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"label" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Str.schema, Bool
True),
( String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"properties" (Value -> (Key, Value))
-> (Schema -> Value) -> Schema -> (Key, Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Value
Schema.json (Schema -> (Key, Value)) -> Schema -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Schema
Dictionary.schema Schema
Property.schema,
Bool
True
)
]
bytePut :: Header -> BytePut.BytePut
bytePut :: Header -> BytePut
bytePut Header
x =
Version -> BytePut
Version.bytePut (Header -> Version
version Header
x)
BytePut -> BytePut -> BytePut
forall a. Semigroup a => a -> a -> a
<> Str -> BytePut
Str.bytePut (Header -> Str
label Header
x)
BytePut -> BytePut -> BytePut
forall a. Semigroup a => a -> a -> a
<> (Property -> BytePut) -> Dictionary Property -> BytePut
forall a. (a -> BytePut) -> Dictionary a -> BytePut
Dictionary.bytePut
Property -> BytePut
Property.bytePut
(Header -> Dictionary Property
properties Header
x)
byteGet :: ByteGet.ByteGet Header
byteGet :: ByteGet Header
byteGet = String -> ByteGet Header -> ByteGet Header
forall a. String -> ByteGet a -> ByteGet a
ByteGet.label String
"Header" (ByteGet Header -> ByteGet Header)
-> ByteGet Header -> ByteGet Header
forall a b. (a -> b) -> a -> b
$ do
version <- String -> ByteGet Version -> ByteGet Version
forall a. String -> ByteGet a -> ByteGet a
ByteGet.label String
"version" ByteGet Version
Version.byteGet
label <- ByteGet.label "label" Str.byteGet
properties <-
ByteGet.label "properties" $
Dictionary.byteGet Property.byteGet
pure Header {version, label, properties}