proto3-suite-0.4.0.0: A low level library for writing out data in the Protocol Buffers wire format

Safe HaskellNone
LanguageHaskell2010

Proto3.Suite.Class

Contents

Description

This module provides type classes for encoding and decoding protocol buffers message, as well as a safer alternative to the raw Wire library based on Generics.

Classes

The Primitive class captures those types which correspond to primitive field types, as defined by the protocol buffers specification. A Primitive type is one which can always be encoded as a single key/value pair in the wire format.

The MessageField class captures those types which are encoded under a single key in the wire format, i.e. primitives, packed and unpacked lists, and embedded messages.

The Message class captures types which correspond to protocol buffers messages. Instances of Message can be written by hand for your types by using the functions in the Encode and Decode modules. In the case where the message format is determined by your Haskell code, you might prefer to derive your Message instances using generic deriving.

Generic Instances

Using the Generics approach, instead of generating Haskell code from a .proto file, we write our message formats as Haskell types, and generate a serializer/deserializer pair.

To use this library, simply derive a Generic instance for your type(s), and use the default Message instance.

For generic Message instances, field numbers are automatically generated, starting at 1. Therefore, adding new fields is a compatible change only at the end of a record. Renaming fields is also safe. You should not use the generic instances if you are starting from an existing .proto file.

Strings

Use Text instead of DotProtoPrimType for string types inside messages.

Example

data MultipleFields =
  MultipleFields { multiFieldDouble :: Double
                 , multiFieldFloat  :: Float
                 , multiFieldInt32  :: Int32
                 , multiFieldInt64  :: Int64
                 , multiFieldString :: TL.Text
                 , multiFieldBool   :: Bool
                 } deriving (Show, Generic, Eq)

instance Message MultipleFields

serialized = toLazyByteString $ MultipleFields 1.0 1.0 1 1 "hi" True

deserialized :: MultipleFields
deserialized = case parse (toStrict serialized) of
                 Left e -> error e
                 Right msg -> msg
Synopsis

Documentation

class Primitive a where Source #

This class captures those types which correspond to primitives in the protocol buffers specification.

It should be possible to fully reconstruct values of these types from a single RawPrimitive. Notably, then, Nested is not Primitive even though it can be embedded, since a nested message may by split up over multiple embedded fields.

Minimal complete definition

encodePrimitive, decodePrimitive

Methods

encodePrimitive :: FieldNumber -> a -> MessageBuilder Source #

Encode a primitive value

decodePrimitive :: Parser RawPrimitive a Source #

Decode a primitive value

primType :: Proxy# a -> DotProtoPrimType Source #

Get the type which represents this type inside another message.

primType :: Named a => Proxy# a -> DotProtoPrimType Source #

Get the type which represents this type inside another message.

Instances
Primitive Bool Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Double Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Float Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Int64 Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Word32 Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Word64 Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Text Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive Text Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive a => Primitive (ForceEmit a) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named e, ProtoEnum e) => Primitive (Enumerated e) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Signed Int32) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Signed Int64) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Signed (Fixed Int32)) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Signed (Fixed Int64)) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Fixed Word32) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Fixed Word64) Source # 
Instance details

Defined in Proto3.Suite.Class

class MessageField a where Source #

This class captures those types which can appear as message fields in the protocol buffers specification, i.e. Primitive types, or lists of Primitive types

Minimal complete definition

Nothing

Methods

encodeMessageField :: FieldNumber -> a -> MessageBuilder Source #

Encode a message field

decodeMessageField :: Parser RawField a Source #

Decode a message field

encodeMessageField :: (HasDefault a, Primitive a) => FieldNumber -> a -> MessageBuilder Source #

Encode a message field

decodeMessageField :: (HasDefault a, Primitive a) => Parser RawField a Source #

Decode a message field

protoType :: Proxy# a -> DotProtoField Source #

Get the type which represents this type inside another message.

protoType :: Primitive a => Proxy# a -> DotProtoField Source #

Get the type which represents this type inside another message.

Instances
MessageField Bool Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Double Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Float Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Int64 Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Word32 Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Word64 Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Text Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField Text Source # 
Instance details

Defined in Proto3.Suite.Class

(HasDefault a, Primitive a) => MessageField (ForceEmit a) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named a, Message a) => MessageField (Nested a) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named a, Message a) => MessageField (NestedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive a => MessageField (UnpackedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Bool) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Double) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Float) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Int32) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Int64) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Word32) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec Word64) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named e, ProtoEnum e) => MessageField (PackedVec (Enumerated e)) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec (Signed (Fixed Int32))) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec (Signed (Fixed Int64))) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec (Fixed Word32)) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (PackedVec (Fixed Word64)) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named e, ProtoEnum e) => MessageField (Enumerated e) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Signed Int32) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Signed Int64) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Signed (Fixed Int32)) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Signed (Fixed Int64)) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Fixed Word32) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Fixed Word64) Source # 
Instance details

Defined in Proto3.Suite.Class

(Ord k, Primitive k, Named v, Message v, MessageField k) => MessageField (Map k (Nested v)) Source # 
Instance details

Defined in Proto3.Suite.Class

(Ord k, Primitive k, MessageField k, Primitive v, MessageField v) => MessageField (Map k v) Source # 
Instance details

Defined in Proto3.Suite.Class

(MessageField e, KnownSymbol comments) => MessageField (e // comments) Source # 
Instance details

Defined in Proto3.Suite.Class

class Message a where Source #

This class captures those types which correspond to protocol buffer messages.

Minimal complete definition

Nothing

Methods

encodeMessage :: FieldNumber -> a -> MessageBuilder Source #

Encode a message

decodeMessage :: FieldNumber -> Parser RawMessage a Source #

Decode a message

dotProto :: Proxy# a -> [DotProtoField] Source #

Generate a .proto message from the type information.

encodeMessage :: (Generic a, GenericMessage (Rep a)) => FieldNumber -> a -> MessageBuilder Source #

Encode a message

decodeMessage :: (Generic a, GenericMessage (Rep a)) => FieldNumber -> Parser RawMessage a Source #

Decode a message

dotProto :: GenericMessage (Rep a) => Proxy# a -> [DotProtoField] Source #

Generate a .proto message from the type information.

Encoding

toLazyByteString :: Message a => a -> ByteString Source #

Serialize a message as a lazy ByteString.

Decoding

class HasDefault a where Source #

A class for types with default values per the protocol buffers spec.

Minimal complete definition

Nothing

Methods

def :: a Source #

The default value for this type.

def :: (Generic a, GenericHasDefault (Rep a)) => a Source #

The default value for this type.

isDefault :: a -> Bool Source #

isDefault :: Eq a => a -> Bool Source #

Instances
HasDefault Bool Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Double Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Float Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Int Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Int64 Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Integer Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Word32 Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Word64 Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Text Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Encoding Source #
>>> isDefault (def @E.Encoding)
True
Instance details

Defined in Proto3.Suite.JSONPB.Class

HasDefault Value Source #
>>> isDefault (def @A.Value)
True
Instance details

Defined in Proto3.Suite.JSONPB.Class

HasDefault Text Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Maybe a) Source #

Used in generated records to represent an unwrapped Nested

Instance details

Defined in Proto3.Suite.Class

Methods

def :: Maybe a Source #

isDefault :: Maybe a -> Bool Source #

HasDefault (Vector a) Source #

Used in fields of generated records to represent an unwrapped 'PackedVec'/'UnpackedVec'

Instance details

Defined in Proto3.Suite.Class

HasDefault a => HasDefault (ForceEmit a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Nested a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (NestedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (UnpackedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (PackedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

ProtoEnum e => HasDefault (Enumerated e) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Signed Int32) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Signed Int64) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Signed (Fixed Int32)) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Signed (Fixed Int64)) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Fixed Int32) Source #

Used in generated records to represent sfixed32

Instance details

Defined in Proto3.Suite.Class

HasDefault (Fixed Int64) Source #

Used in generated records to represent sfixed64

Instance details

Defined in Proto3.Suite.Class

HasDefault (Fixed Word32) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Fixed Word64) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Map k v) Source # 
Instance details

Defined in Proto3.Suite.Class

Methods

def :: Map k v Source #

isDefault :: Map k v -> Bool Source #

fromByteString :: Message a => ByteString -> Either ParseError a Source #

Parse any message that can be decoded.

fromB64 :: Message a => ByteString -> Either ParseError a Source #

As fromByteString, except the input bytestring is base64-encoded.

Documentation

class Named a where Source #

This class captures those types whose names need to appear in .proto files.

It has a default implementation for any data type which is an instance of the Generic class, which will extract the name of the type constructor.

Minimal complete definition

Nothing

Methods

nameOf :: IsString string => Proxy# a -> string Source #

Get the name of a type constructor

nameOf :: (IsString string, GenericNamed (Rep a)) => Proxy# a -> string Source #

Get the name of a type constructor

Instances
Named Shape Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Methods

nameOf :: IsString string => Proxy# Shape -> string Source #

Named Bar Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Methods

nameOf :: IsString string => Proxy# Bar -> string Source #

Named Foo Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Methods

nameOf :: IsString string => Proxy# Foo -> string Source #

class ProtoEnum a => Finite a where Source #

Enumerable types with finitely many values.

This class can be derived whenever a sum type is an instance of Generic, and only consists of zero-argument constructors. The derived instance should be compatible with ProtoEnum instances, in the sense that

map (fromJust . toProtoEnumMay . snd) enumerate

should enumerate all values of the type without runtime errors.

Minimal complete definition

Nothing

Methods

enumerate :: IsString string => Proxy# a -> [(string, Int32)] Source #

Enumerate values of a finite type, along with names of constructors.

enumerate :: (IsString string, Generic a, GenericFinite (Rep a)) => Proxy# a -> [(string, Int32)] Source #

Enumerate values of a finite type, along with names of constructors.

Instances
Finite Shape Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Methods

enumerate :: IsString string => Proxy# Shape -> [(string, Int32)] Source #

message :: (Message a, Named a) => Proxy# a -> DotProtoDefinition Source #

Generate metadata for a message type.

enum :: (Finite e, Named e) => Proxy# e -> DotProtoDefinition Source #

Generate metadata for an enum type.

Generic Classes

class GenericMessage (f :: * -> *) where Source #

Associated Types

type GenericFieldCount f :: Nat Source #

Instances
GenericMessage (U1 :: Type -> Type) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount U1 :: Nat Source #

MessageField c => GenericMessage (K1 i c :: Type -> Type) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (K1 i c) :: Nat Source #

(KnownNat (GenericFieldCount f), GenericMessage f, GenericMessage g) => GenericMessage (f :*: g) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (f :*: g) :: Nat Source #

GenericMessage f => GenericMessage (M1 D t f) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (M1 D t f) :: Nat Source #

GenericMessage f => GenericMessage (M1 C t f) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (M1 C t f) :: Nat Source #

(Selector s, GenericMessage f) => GenericMessage (M1 S s f) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (M1 S s f) :: Nat Source #