{-# LANGUAGE ScopedTypeVariables #-}
module Data.Bond.Internal.BondedUtils where
import {-# SOURCE #-} Data.Bond.Internal.CompactBinaryProto
import {-# SOURCE #-} Data.Bond.Internal.FastBinaryProto
import Data.Bond.Marshal
import Data.Bond.Proto
import Data.Bond.Struct
import Data.Bond.TypedSchema
import Data.Bond.Internal.Bonded
import Data.Bond.Internal.Protocol
import Control.Applicative
import Data.Proxy
import Prelude
import qualified Data.ByteString.Lazy as BL
bondRecode :: forall t a. (BondProto t, BondStruct a) => t -> Bonded a -> Either String (Bonded a)
bondRecode t (BondedObject a) = BondedStream <$> bondMarshal t a
bondRecode t (BondedStream stream)
| sig == protoSig t = Right $ BondedStream stream
| isTaggedSource = do
v <- bondUnmarshalTagged stream
s <- bondMarshalWithSchema t schema v
return (BondedStream s)
| otherwise = do
v <- bondUnmarshalWithSchema schema stream
s <- bondMarshalWithSchema t schema v
return (BondedStream s)
where
sig = BL.take 4 stream
schema = getSchema (Proxy :: Proxy a)
taggedSigs = [protoSig FastBinaryProto, protoSig CompactBinaryProto, protoSig CompactBinaryV1Proto]
isTaggedSource = sig `elem` taggedSigs
bondRecodeToTagged :: forall t a. (BondTaggedProto t, BondStruct a) => t -> Bonded a -> Either String (Bonded a)
bondRecodeToTagged t (BondedObject a) = BondedStream <$> bondMarshal t a
bondRecodeToTagged t (BondedStream stream)
| sig == protoSig t = Right $ BondedStream stream
| isTaggedSource = do
v <- bondUnmarshalTagged stream
s <- bondMarshalTagged t v
return (BondedStream s)
| otherwise = do
v <- bondUnmarshalWithSchema schema stream
s <- bondMarshalWithSchema t schema v
return (BondedStream s)
where
sig = BL.take 4 stream
schema = getSchema (Proxy :: Proxy a)
taggedSigs = [protoSig FastBinaryProto, protoSig CompactBinaryProto, protoSig CompactBinaryV1Proto]
isTaggedSource = sig `elem` taggedSigs
bondRecodeStruct :: BondProto t => t -> StructSchema -> Bonded Struct -> Either String (Bonded Struct)
bondRecodeStruct t schema (BondedObject a) = BondedStream <$> bondMarshalWithSchema t schema a
bondRecodeStruct t schema (BondedStream stream)
| sig == protoSig t = Right $ BondedStream stream
| isTaggedSource = do
v <- bondUnmarshalTagged stream
s <- bondMarshalWithSchema t schema v
return (BondedStream s)
| otherwise = do
v <- bondUnmarshalWithSchema schema stream
s <- bondMarshalWithSchema t schema v
return (BondedStream s)
where
sig = BL.take 4 stream
taggedSigs = [protoSig FastBinaryProto, protoSig CompactBinaryProto, protoSig CompactBinaryV1Proto]
isTaggedSource = sig `elem` taggedSigs