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
endYour 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.Extensionfor 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.
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
Decodes a Protobuf binary into a struct.
Errors may be raised if there's something wrong in the binary.
Specs
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
Builds and updates the struct with passed fields.
Examples
MyMessage.new(field1: "foo")
#=> %MyMessage{field1: "foo", ...}
Specs
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
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
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)
#=> <<...>>
Specs
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