Protobuf behaviour (protobuf v0.9.0) View Source

protoc should always be used to generate code instead of writing the code by hand.

By use this module, macros defined in Protobuf.DSL will be injected. Most of thee macros are equal to definition in .proto files.

defmodule Foo do
  use Protobuf, syntax: :proto3

  defstruct [:a, :b]

  field :a, 1, type: :int32
  field :b, 2, type: :string
end

Your Protobuf message(module) is just a normal Elixir struct. Some useful functions are also injected, see "Callbacks" for details. Examples:

foo1 = Foo.new!(%{a: 1})
foo1.b == ""
bin = Foo.encode(foo1)
foo1 == Foo.decode(bin)

Except functions in "Callbacks", some other functions may be defined:

  • Extension functions when your Protobuf message use extensions. See Protobuf.Extension for details.
    • put_extension(struct, extension_mod, field, value)
    • get_extension(struct, extension_mod, field, default \ nil)

Link to this section Summary

Callbacks

Decodes a Protobuf binary into a struct.

Encodes the given struct into to a Protobuf binary.

Builds a blank struct with default values. This and other "new" functions are preferred than raw building struct method like %Foo{}.

Builds and updates the struct with passed fields.

Similar to new/1, but use struct!/2 to build the struct, so errors will be raised if unknown keys are passed.

Returns nil or a transformer module that implements the Protobuf.TransformModule behaviour.

Functions

Decodes the given binary data interpreting it as the Protobuf message module.

Encodes the given Protobuf struct into a binary.

Encodes the given Protobuf struct into iodata.

Loads extensions modules.

Link to this section Callbacks

Specs

decode(binary()) :: struct()

Decodes a Protobuf binary into a struct.

Errors may be raised if there's something wrong in the binary.

Specs

encode(struct()) :: binary()

Encodes the given struct into to a Protobuf binary.

Errors may be raised if there's something wrong in the struct.

If you want to encode to iodata instead of to a binary, use encode_to_iodata/1.

Specs

new() :: struct()

Builds a blank struct with default values. This and other "new" functions are preferred than raw building struct method like %Foo{}.

In proto3, the zero values are the default values.

Specs

new(Enum.t()) :: struct()

Builds and updates the struct with passed fields.

Examples

MyMessage.new(field1: "foo")
#=> %MyMessage{field1: "foo", ...}

Specs

new!(Enum.t()) :: struct()

Similar to new/1, but use struct!/2 to build the struct, so errors will be raised if unknown keys are passed.

Specs

transform_module() :: module() | nil

Returns nil or a transformer module that implements the Protobuf.TransformModule behaviour.

This function is overridable in your module.

Link to this section Functions

Specs

decode(binary(), message) :: %{__struct__: message} when message: module()

Decodes the given binary data interpreting it as the Protobuf message module.

It's preferrable to use the message's decode/1 function. For a message MyMessage:

MyMessage.decode(<<...>>)
#=> %MyMessage{...}

This function raises an error if anything goes wrong with decoding.

Examples

Protobuf.decode(<<...>>, MyMessage)
#=> %MyMessage{...}

Protobuf.decode(<<"bad data">>, MyMessage)
#=> ** (Protobuf.DecodeError) ...

Specs

encode(struct()) :: binary()

Encodes the given Protobuf struct into a binary.

If you want to encode to iodata instead, see encode_to_iodata/1.

Examples

struct = MyMessage.new()
Protobuf.encode(struct)
#=> <<...>>
Link to this function

encode_to_iodata(struct)

View Source

Specs

encode_to_iodata(struct()) :: iodata()

Encodes the given Protobuf struct into iodata.

Examples

struct = MyMessage.new()
Protobuf.encode_to_iodata(struct)
#=> [...]

Specs

load_extensions() :: :ok

Loads extensions modules.

This function should be called in your application's Application.start/2 callback, as seen in the example below, if you wish to use extensions.

Example

@impl Application
def start(_type, _args) do
  Protobuf.load_extensions()
  Supervisor.start_link([], strategy: :one_for_one)
end