Protox (Protox v2.0.4)
View SourceUse this module to generate the Elixir structs corresponding to a set of protobuf definitions and to encode/decode instances of these structures.
Elixit structs generation examples
From a set of files:
defmodule Dummy do
  use Protox,
    files: [
      "./defs/foo.proto",
      "./defs/bar.proto",
      "./defs/baz/fiz.proto",
    ]
endFrom a string:
defmodule Dummy do
  use Protox,
    schema: """
    syntax = "proto3";
    package fiz;
    message Baz {
    }
    message Foo {
      map<int32, Baz> b = 2;
    }
    """
endThe generated modules respect the package declaration. For instance, in the above example,
both the Fiz.Baz and Fiz.Foo modules will be generated.
Encoding/decoding
For the rest of this module documentation, we suppose the following protobuf messages are defined:
defmodule Dummy do
  use Protox,
    schema: """
      syntax = "proto3";
      package fiz;
      message Baz {
      }
      enum Enum {
        FOO = 0;
        BAR = 1;
      }
      message Foo {
        Enum a = 1;
        map<int32, Baz> b = 2;
      }
    """,
    namespace: Namespace
  use Protox,
    schema: """
    syntax = "proto3";
    message Msg {
      map<int32, string> msg_k = 8;
    }
    """
  use Protox,
    schema: """
    syntax = "proto3";
    message Sub {
      int32 a = 1;
    }
    """
endSee each function documentation to see how they are used to encode and decode protobuf messages.
Summary
Functions
Decode a binary into a protobuf message.
Examples
iex> binary = <<8, 42, 18, 7, 8, 1, 18, 3, 102, 111, 111>>
iex> {:ok, msg} = Protox.decode(binary, ProtoxExample)
iex> msg
%ProtoxExample{a: 42, b: %{1 => "foo"}}
iex> binary = <<66, 7, 8, 1, 18, 3, 102, 111, 66, 7, 8, 2, 18, 3, 98, 97, 114>>
iex> {:error, reason} = Protox.decode(binary, ProtoxExample)
iex> reason
%Protox.DecodingError{
              message: "Could not decode data (invalid wire type 7)",
              binary: <<7, 8, 2, 18, 3, 98, 97, 114>>
            }Throwing version of decode/2.
@spec encode(struct()) :: {:ok, iodata(), non_neg_integer()} | {:error, any()}
Encode a protobuf message into IO data.
Examples
iex> msg = %ProtoxExample{a: 3, b: %{1 => "some string"}}
iex> {:ok, iodata, _iodata_size} = Protox.encode(msg)
iex> IO.iodata_to_binary(iodata)
<<8, 3, 18, 15, 8, 1, 18, 11, 115, 111, 109, 101, 32, 115, 116, 114, 105, 110, 103>>
iex> msg = %ProtoxExample{a: "should not be a string"}
iex> {:error, reason} = Protox.encode(msg)
iex> reason
%Protox.EncodingError{field: :a, message: "Could not encode field :a (invalid field value)"}@spec encode!(struct()) :: {iodata(), non_neg_integer()} | no_return()
Throwing version of encode/1.