runtime/src/Data/Bond/Proto.hs
module Data.Bond.Proto where
import Data.Bond.Struct
import Data.Bond.TypedSchema
import Data.Bond.Internal.Protocol
import qualified Data.ByteString.Lazy as BL
-- |Typeclass for Bond serialization protocols.
class BondProto t where
-- |Deserialize structure from stream.
bondRead :: BondStruct a => t -> BL.ByteString -> Either String a
-- |Serialize structure to stream.
bondWrite :: BondStruct a => t -> a -> Either String BL.ByteString
-- |Deserialize structure from stream using provided schema.
bondReadWithSchema :: t -> StructSchema -> BL.ByteString -> Either String Struct
-- |Serialize structure to stream using provided schema.
bondWriteWithSchema :: t -> StructSchema -> Struct -> Either String BL.ByteString
-- |Serialize structure to stream and add protocol header. See 'Data.Bond.Marshal.bondUnmarshal' for deserialization.
bondMarshal :: BondStruct a => t -> a -> Either String BL.ByteString
bondMarshal t = fmap (BL.append $ protoSig t) . bondWrite t
-- |Serialize structure to stream using provided schema and add protocol header. See 'Data.Bond.Marshal.bondUnmarshalWithSchema' for deserialization.
bondMarshalWithSchema :: t -> StructSchema -> Struct -> Either String BL.ByteString
bondMarshalWithSchema t s = fmap (BL.append $ protoSig t) . bondWriteWithSchema t s
-- |Get protocol header.
protoSig :: t -> BL.ByteString
-- |Typeclass for tagged Bond serialization protocols. Such protocols support schemaless operations.
class BondProto t => BondTaggedProto t where
-- |Deserialize structure from stream without schema.
bondReadTagged :: t -> BL.ByteString -> Either String Struct
-- |Serialize structure to stream without schema.
bondWriteTagged :: t -> Struct -> Either String BL.ByteString
-- |Serialize structure to stream without schema and add protocol header. See 'Data.Bond.Marshal.bondUnmarshalTagged' for deserialization.
bondMarshalTagged :: t -> Struct -> Either String BL.ByteString
bondMarshalTagged t = fmap (BL.append $ protoSig t) . bondWriteTagged t