runtime/src/Data/Bond/Marshal.hs
{-# LANGUAGE ScopedTypeVariables, MultiWayIf #-}
module Data.Bond.Marshal (
bondUnmarshal,
bondUnmarshalWithSchema,
bondUnmarshalTagged
) where
import {-# SOURCE #-} Data.Bond.Internal.CompactBinaryProto
import {-# SOURCE #-} Data.Bond.Internal.FastBinaryProto
import {-# SOURCE #-} Data.Bond.Internal.JsonProto
import {-# SOURCE #-} Data.Bond.Internal.SimpleBinaryProto
import Data.Bond.Proto
import Data.Bond.Struct
import Data.Bond.TypedSchema
import Data.Bond.Internal.Protocol
import qualified Data.ByteString.Lazy as BL
-- |Deserialize structure from stream, finding protocol from stream header.
bondUnmarshal :: BondStruct a => BL.ByteString -> Either String a
bondUnmarshal s
= let (sig, rest) = BL.splitAt 4 s
in if | sig == protoSig FastBinaryProto -> bondRead FastBinaryProto rest
| sig == protoSig CompactBinaryProto -> bondRead CompactBinaryProto rest
| sig == protoSig CompactBinaryV1Proto -> bondRead CompactBinaryV1Proto rest
| sig == protoSig SimpleBinaryProto -> bondRead SimpleBinaryProto rest
| sig == protoSig SimpleBinaryV1Proto -> bondRead SimpleBinaryV1Proto rest
| sig == protoSig JsonProto -> bondRead JsonProto rest
| otherwise -> Left "unknown signature in marshalled stream"
-- |Deserialize structure from stream with provided schema, finding protocol from stream header.
bondUnmarshalWithSchema :: StructSchema -> BL.ByteString -> Either String Struct
bondUnmarshalWithSchema schema s
= let (sig, rest) = BL.splitAt 4 s
in if | sig == protoSig FastBinaryProto -> bondReadWithSchema FastBinaryProto schema rest
| sig == protoSig CompactBinaryProto -> bondReadWithSchema CompactBinaryProto schema rest
| sig == protoSig CompactBinaryV1Proto -> bondReadWithSchema CompactBinaryV1Proto schema rest
| sig == protoSig SimpleBinaryProto -> bondReadWithSchema SimpleBinaryProto schema rest
| sig == protoSig SimpleBinaryV1Proto -> bondReadWithSchema SimpleBinaryV1Proto schema rest
| sig == protoSig JsonProto -> bondReadWithSchema JsonProto schema rest
| otherwise -> Left "unknown signature in marshalled stream"
-- |Deserialize structure from stream without schema, finding protocol from stream header.
bondUnmarshalTagged :: BL.ByteString -> Either String Struct
bondUnmarshalTagged s
= let (sig, rest) = BL.splitAt 4 s
in if | sig == protoSig FastBinaryProto -> bondReadTagged FastBinaryProto rest
| sig == protoSig CompactBinaryProto -> bondReadTagged CompactBinaryProto rest
| sig == protoSig CompactBinaryV1Proto -> bondReadTagged CompactBinaryV1Proto rest
| sig == protoSig SimpleBinaryProto -> Left "SimpleBinaryProto does not support schemaless operations"
| sig == protoSig SimpleBinaryV1Proto -> Left "SimpleBinaryV1Proto does not support schemaless operations"
| sig == protoSig JsonProto -> Left "JsonProto does not support schemaless operations"
| otherwise -> Left "unknown signature in marshalled stream"