module Rattletrap.Encode.PropertyValue
  ( putPropertyValue
  ) where

import Rattletrap.Encode.Dictionary
import Rattletrap.Encode.Float32le
import Rattletrap.Encode.Int32le
import Rattletrap.Encode.List
import Rattletrap.Encode.Str
import Rattletrap.Encode.Word64le
import Rattletrap.Encode.Word8le
import Rattletrap.Type.PropertyValue

import qualified Data.Binary as Binary

putPropertyValue :: (a -> Binary.Put) -> PropertyValue a -> Binary.Put
putPropertyValue putProperty value = case value of
  PropertyValueArray list -> putList (putDictionary putProperty) list
  PropertyValueBool word8 -> putWord8 word8
  PropertyValueByte k mv -> do
    putText k
    case mv of
      Nothing -> pure ()
      Just v -> putText v
  PropertyValueFloat float32 -> putFloat32 float32
  PropertyValueInt int32 -> putInt32 int32
  PropertyValueName text -> putText text
  PropertyValueQWord word64 -> putWord64 word64
  PropertyValueStr text -> putText text