module Octane.Type.Property (Property(..)) where
import Octane.Core
import Octane.Type.Primitive.PCString
import Octane.Type.Primitive.Boolean
import Octane.Type.Primitive.Float32LE
import Octane.Type.Primitive.Int32LE
import Octane.Type.Primitive.Int64LE
import Octane.Type.Primitive.List
import Octane.Type.Primitive.Dictionary
data Property
= ArrayProperty Int64LE (List (Dictionary Property))
| BoolProperty Int64LE Boolean
| ByteProperty Int64LE (PCString, PCString)
| FloatProperty Int64LE Float32LE
| IntProperty Int64LE Int32LE
| NameProperty Int64LE PCString
| QWordProperty Int64LE Int64LE
| StrProperty Int64LE PCString
deriving (Eq, Generic, NFData, Show)
instance Binary Property where
get = do
kind <- get
size <- get
case getPCString kind of
"ArrayProperty" -> do
value <- get
ArrayProperty size value & return
"BoolProperty" -> do
value <- get
BoolProperty size value & return
"ByteProperty" -> do
key <- get
value <- get
ByteProperty size (key, value) & return
"FloatProperty" -> do
value <- case getInt64LE size of
4 -> get
x -> fail ("unknown FloatProperty size " ++ show x)
FloatProperty size value & return
"IntProperty" -> do
value <- case getInt64LE size of
4 -> get
x -> fail ("unknown IntProperty size " ++ show x)
IntProperty size value & return
"NameProperty" -> do
value <- get
NameProperty size value & return
"QWordProperty" -> do
value <- case getInt64LE size of
8 -> get
x -> fail ("unknown QWordProperty size " ++ show x)
QWordProperty size value & return
"StrProperty" -> do
value <- get
StrProperty size value & return
x -> fail ("unknown property type " ++ show x)
put property = case property of
ArrayProperty size value -> do
"ArrayProperty" & PCString & put
size & put
value & put
BoolProperty size value -> do
"BoolProperty" & PCString & put
size & put
value & put
ByteProperty size (key, value) -> do
"ByteProperty" & PCString & put
size & put
key & put
value & put
FloatProperty size value -> do
"FloatProperty" & PCString & put
size & put
value & put
IntProperty size value -> do
"IntProperty" & PCString & put
size & put
value & put
NameProperty size value -> do
"NameProperty" & PCString & put
size & put
value & put
QWordProperty size value -> do
"QWordProperty" & PCString & put
size & put
value & put
StrProperty size value -> do
"StrProperty" & PCString & put
size & put
value & put