module Data.Bond.Struct where
import Data.Bond.Schema.BondDataType
import Data.Bond.Types
import qualified Data.Map.Strict as M
data Value
= BOOL Bool
| INT8 Int8
| INT16 Int16
| INT32 Int32
| INT64 Int64
| UINT8 Word8
| UINT16 Word16
| UINT32 Word32
| UINT64 Word64
| FLOAT Float
| DOUBLE Double
| STRING Utf8
| WSTRING Utf16
| STRUCT Struct
| LIST BondDataType [Value]
| SET BondDataType [Value]
| MAP BondDataType BondDataType [(Value, Value)]
| BONDED (Bonded Struct)
deriving Show
instance Eq Value where
(BOOL a) == (BOOL b) = a == b
(INT8 a) == (INT8 b) = a == b
(INT16 a) == (INT16 b) = a == b
(INT32 a) == (INT32 b) = a == b
(INT64 a) == (INT64 b) = a == b
(UINT8 a) == (UINT8 b) = a == b
(UINT16 a) == (UINT16 b) = a == b
(UINT32 a) == (UINT32 b) = a == b
(UINT64 a) == (UINT64 b) = a == b
(FLOAT a) == (FLOAT b) = a == b
(DOUBLE a) == (DOUBLE b) = a == b
(STRING a) == (STRING b) = a == b
(WSTRING a) == (WSTRING b) = a == b
(STRUCT a) == (STRUCT b) = a == b
(LIST ta a) == (LIST tb b) = ta == tb && a == b
(SET ta a) == (SET tb b) = ta == tb && a == b
(MAP ka va a) == (MAP kb vb b) = ka == kb && va == vb && a == b
(BONDED (BondedObject a)) == (BONDED (BondedObject b)) = a == b
(BONDED (BondedStream a)) == (BONDED (BondedStream b)) = a == b
_ == _ = False
data Struct = Struct { base :: Maybe Struct, fields :: M.Map Ordinal Value }
deriving (Show, Eq)
valueName :: Value -> String
valueName (BOOL _) = "bool"
valueName (INT8 _) = "int8"
valueName (INT16 _) = "int16"
valueName (INT32 _) = "int32"
valueName (INT64 _) = "int64"
valueName (UINT8 _) = "uint8"
valueName (UINT16 _) = "uint16"
valueName (UINT32 _) = "uint32"
valueName (UINT64 _) = "uint64"
valueName (FLOAT _) = "float"
valueName (DOUBLE _) = "double"
valueName (STRING _) = "string"
valueName (WSTRING _) = "wstring"
valueName (STRUCT _) = "struct"
valueName LIST{} = "list"
valueName SET{} = "set"
valueName MAP{} = "map"
valueName (BONDED _) = "bonded"