proto3-suite-0.9.4: A higher-level API to the proto3-wire library
Safe HaskellNone
LanguageHaskell2010

Proto3.Suite.Class

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 String 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.

Instances

Instances details
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 ShortByteString 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 ShortText Source # 
Instance details

Defined in Proto3.Suite.Class

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 (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (Bytes ShortByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named e, ProtoEnum e) => Primitive (Enumerated e) 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

Primitive a => Primitive (ForceEmit a) 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 (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

Primitive (String ShortText) 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

protoType :: Proxy# a -> DotProtoField Source #

Get the type which represents this type inside another message.

Instances

Instances details
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 ShortByteString 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

MessageField ShortText Source # 
Instance details

Defined in Proto3.Suite.Class

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 (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (Bytes ShortByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

(Named e, ProtoEnum e) => MessageField (Enumerated e) 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

(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

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 (Fixed Word32)) Source # 
Instance details

Defined in Proto3.Suite.Class

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

Defined in Proto3.Suite.Class

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

Defined in Proto3.Suite.Class

MessageField (PackedVec (Signed Int64)) 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 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 (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 (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

MessageField (String ShortText) Source # 
Instance details

Defined in Proto3.Suite.Class

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

Defined in Proto3.Suite.Class

Primitive a => MessageField (Maybe (ForceEmit a)) 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.

Instances

Instances details
Message Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

Message Int64 Source # 
Instance details

Defined in Proto3.Suite.Class

Message Word32 Source # 
Instance details

Defined in Proto3.Suite.Class

Message Word64 Source # 
Instance details

Defined in Proto3.Suite.Class

Message ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

Message ByteString Source # 
Instance details

Defined in Proto3.Suite.Class

Message ShortByteString Source # 
Instance details

Defined in Proto3.Suite.Class

Message Timestamp Source # 
Instance details

Defined in Google.Protobuf.Timestamp

Message Bar Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Message Foo Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Message Text Source # 
Instance details

Defined in Proto3.Suite.Class

Message Text Source # 
Instance details

Defined in Proto3.Suite.Class

Message ShortText Source # 
Instance details

Defined in Proto3.Suite.Class

Message Bool Source # 
Instance details

Defined in Proto3.Suite.Class

Message Double Source # 
Instance details

Defined in Proto3.Suite.Class

Message Float Source # 
Instance details

Defined in Proto3.Suite.Class

(MessageField a, Primitive a) => Message (Wrapped a) Source # 
Instance details

Defined in Proto3.Suite.Class

Message (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

Message (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

Message (String ShortText) Source # 
Instance details

Defined in Proto3.Suite.Class

(MessageField k, MessageField v) => Message (k, v) Source # 
Instance details

Defined in Proto3.Suite.Class

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.

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

isDefault :: a -> Bool Source #

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

Instances

Instances details
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 Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Int64 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 ShortByteString Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Timestamp Source # 
Instance details

Defined in Google.Protobuf.Timestamp

HasDefault Text Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Text Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault ShortText Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault Integer Source # 
Instance details

Defined in Proto3.Suite.Class

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 a => HasDefault (Wrapped a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Bytes ByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Bytes ShortByteString) Source # 
Instance details

Defined in Proto3.Suite.Class

ProtoEnum e => HasDefault (Enumerated e) 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 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 (PackedVec a) 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 (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (String Text) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (String ShortText) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (UnpackedVec a) Source # 
Instance details

Defined in Proto3.Suite.Class

HasDefault (Vector a) Source #

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

Instance details

Defined in Proto3.Suite.Class

Methods

def :: Vector a Source #

isDefault :: Vector a -> Bool Source #

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 (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.

coerceOver :: forall {k} (a :: k) (b :: k) f. Coercible (f a) (f b) => f a -> f b Source #

Like coerce but lets you avoid specifying a type constructor (such a as parser) that is common to both the input and output types.

unsafeCoerceOver :: forall {k} (a :: k) (b :: k) f. f a -> f b Source #

Like unsafeCoerce but lets you avoid specifying a type constructor (such a as parser) that is common to both the input and output types.

class ZigZag a where Source #

Minimal complete definition

Nothing

Associated Types

type ZigZagEncoded a Source #

The unsigned integral type used to hold the value after ZigZag encoding but before varint encoding, and after varint decoding but before ZigZag decoding.

NOTE: The two integral types must have the same width both to correctly encode large sint32 values and, during decoding, to compensate for overlong encodings emitted by versions of this library before v0.8.2. Those older versions incorrectly sign-extended ZigZag-encoded sint32 values in packed fields.

Methods

zigZagEncode :: Signed a -> ZigZagEncoded a Source #

Importantly, the resulting unsigned integer has the same width as the input type, so that any integral promotion before or during varint encoding will zero-pad instead of sign-extend.

Sign extension would result in a more bulky encoding and would violate the compatibility guarantee in https://protobuf.dev/programming-guides/proto3/#updating that an sint32 value can be decoded as if it had type sint64.

zigZagDecode :: ZigZagEncoded a -> Signed a Source #

Importantly, the given unsigned integer has the same width as the result type. If the encoder was a version of this library before v0.8.2, and the field was packed, it would have incorrectly sign-extended between the ZigZag encoding step and the varint encoding step, rather than zero-padding. By narrowing before we ZigZag decode, we exclude the incorrect bits.

Maintaining compatibility with versions of this library before v0.8.2 does have a curious side effect. When an sint64 value outside the range of sint32 is decoded as type sint32, the sign will be preserved and the magnitude decreased, rather than the more typical conversion that outputs the remainder after division by 2^32, as would happen with 'fromIntegral Int64 Int32'. One could argue that our behavior is surprising and unusual. However, both narrowings lose information, and neither is supported by protobuf: https://protobuf.dev/programming-guides/dos-donts/ says, "However, changing a field's message type will break unless the new message is a superset of the old one."

Instances

Instances details
ZigZag Int32 Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type ZigZagEncoded Int32 
Instance details

Defined in Proto3.Suite.Class

ZigZag Int64 Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type ZigZagEncoded Int64 
Instance details

Defined in Proto3.Suite.Class

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

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

Instances

Instances details
Named Timestamp Source # 
Instance details

Defined in Google.Protobuf.Timestamp

Methods

nameOf :: IsString string => Proxy# Timestamp -> 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 #

Named Shape Source # 
Instance details

Defined in Proto3.Suite.Tutorial

Methods

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

NameOfWrapperFor a => Named (Wrapped a) Source # 
Instance details

Defined in Proto3.Suite.Class

Methods

nameOf :: IsString string => Proxy# (Wrapped a) -> 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.

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

Instances

Instances details
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 :: Type -> Type) where Source #

Associated Types

type GenericFieldCount (f :: Type -> Type) :: Nat Source #

Instances

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

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (U1 :: Type -> Type) 
Instance details

Defined in Proto3.Suite.Class

type GenericFieldCount (U1 :: Type -> Type) = 0
(KnownNat (GenericFieldCount f), GenericMessage f, GenericMessage g) => GenericMessage (f :*: g) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (f :*: g) 
Instance details

Defined in Proto3.Suite.Class

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

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (K1 i c :: Type -> Type) 
Instance details

Defined in Proto3.Suite.Class

type GenericFieldCount (K1 i c :: Type -> Type) = 1
GenericMessage f => GenericMessage (M1 C t f) Source # 
Instance details

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (M1 C t f) 
Instance details

Defined in Proto3.Suite.Class

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

Defined in Proto3.Suite.Class

Associated Types

type GenericFieldCount (M1 D t f) 
Instance details

Defined in Proto3.Suite.Class

(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) 
Instance details

Defined in Proto3.Suite.Class