{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
module Octane.Type.Property
( Property(..)
, module Octane.Type.Property.ArrayProperty
, module Octane.Type.Property.BoolProperty
, module Octane.Type.Property.ByteProperty
, module Octane.Type.Property.FloatProperty
, module Octane.Type.Property.IntProperty
, module Octane.Type.Property.NameProperty
, module Octane.Type.Property.QWordProperty
, module Octane.Type.Property.StrProperty
) where
import Octane.Type.Property.ArrayProperty
import Octane.Type.Property.BoolProperty
import Octane.Type.Property.ByteProperty
import Octane.Type.Property.FloatProperty
import Octane.Type.Property.IntProperty
import Octane.Type.Property.NameProperty
import Octane.Type.Property.QWordProperty
import Octane.Type.Property.StrProperty
import qualified Control.DeepSeq as DeepSeq
import qualified Data.Aeson as Aeson
import qualified Data.Binary as Binary
import qualified GHC.Generics as Generics
import qualified Octane.Type.Text as Text
data Property
= PropertyArray (ArrayProperty Property)
| PropertyBool BoolProperty
| PropertyByte ByteProperty
| PropertyFloat FloatProperty
| PropertyInt IntProperty
| PropertyName NameProperty
| PropertyQWord QWordProperty
| PropertyStr StrProperty
deriving (Eq, Generics.Generic, Show)
instance Binary.Binary Property where
get = do
kind <- Binary.get
case kind of
_
| kind == arrayProperty -> do
array <- Binary.get
pure (PropertyArray array)
_
| kind == boolProperty -> do
bool <- Binary.get
pure (PropertyBool bool)
_
| kind == byteProperty -> do
byte <- Binary.get
pure (PropertyByte byte)
_
| kind == floatProperty -> do
float <- Binary.get
pure (PropertyFloat float)
_
| kind == intProperty -> do
int <- Binary.get
pure (PropertyInt int)
_
| kind == nameProperty -> do
name <- Binary.get
pure (PropertyName name)
_
| kind == qWordProperty -> do
qWord <- Binary.get
pure (PropertyQWord qWord)
_
| kind == strProperty -> do
str <- Binary.get
pure (PropertyStr str)
_ -> fail ("unknown property type " ++ show (#unpack kind))
put property =
case property of
PropertyArray array -> do
Binary.put arrayProperty
Binary.put array
PropertyBool bool -> do
Binary.put boolProperty
Binary.put bool
PropertyByte byte -> do
Binary.put byteProperty
Binary.put byte
PropertyFloat float -> do
Binary.put floatProperty
Binary.put float
PropertyInt int -> do
Binary.put intProperty
Binary.put int
PropertyName name -> do
Binary.put nameProperty
Binary.put name
PropertyQWord qWord -> do
Binary.put qWordProperty
Binary.put qWord
PropertyStr str -> do
Binary.put strProperty
Binary.put str
instance DeepSeq.NFData Property
instance Aeson.ToJSON Property where
toJSON property =
case property of
PropertyArray x -> Aeson.toJSON x
PropertyBool x -> Aeson.toJSON x
PropertyByte x -> Aeson.toJSON x
PropertyFloat x -> Aeson.toJSON x
PropertyInt x -> Aeson.toJSON x
PropertyName x -> Aeson.toJSON x
PropertyQWord x -> Aeson.toJSON x
PropertyStr x -> Aeson.toJSON x
arrayProperty :: Text.Text
arrayProperty = "ArrayProperty"
boolProperty :: Text.Text
boolProperty = "BoolProperty"
byteProperty :: Text.Text
byteProperty = "ByteProperty"
floatProperty :: Text.Text
floatProperty = "FloatProperty"
intProperty :: Text.Text
intProperty = "IntProperty"
nameProperty :: Text.Text
nameProperty = "NameProperty"
qWordProperty :: Text.Text
qWordProperty = "QWordProperty"
strProperty :: Text.Text
strProperty = "StrProperty"