Elixir protocol buffers compiler
To use exprotoc
, first include exprotoc
in your mixfile as a
dependency. Then, in the project property of your mix project, add
:exprotoc
to the list of compilers (e.g. compilers: [:exprotoc, :elixir, :app
).
To configure the :exprotoc
compiler prepass, there are three
exposed options: proto_out
, proto_files
, and proto_path
.
Binary string that represents the directory generated code should
be output to. Defaults to the lib
folder.
This should be a list of all the proto files you wish to turn into elixir code.
List of directories in the order exprotoc
should visit to look
for proto files and imports.
defmodule Example.Mixfile do
use Mix.Project
def project do
[ app: :example,
version: "0.0.1",
elixir: "~> 0.12.5",
compilers: [:exprotoc, :elixir, :app],
proto_files: ["example.proto"],
proto_path: ["priv"],
deps: deps ]
end
defp deps do
[{ :exprotoc, github: "jeremyong/exprotoc" }]
end
end
This will compile the Example
application with the generated code
for the proto file example.proto
. Because no proto_out
option
is specified, the generated code will be output to the lib folder.
Just access your message modules as you would a standard Elixir dict.
For example, with the following proto message:
package Example;
message Foo {
enum Bar {
Zap = 150;
}
required Foo a = 1;
required uint32 b = 2;
}
exprotoc
will create a module Example.Foo
and submodule
Example.Foo.Bar
.
You can create a new message simply with Example.Foo.new
or
Example.Foo.new a: Example.Foo.Bar.zap
.
You can access your message with the access protocol. For example:
message = Example.Foo.new a: Example.Foo.Bar.zap
IO.inspect message[:a] # Will output { Example.Foo.Bar, :zap }
IO.inspect message[:b] # Will output nil
message = Example.Foo.put message, :b, 150
IO.inspect message[:b] # Will output 150
All message modules export the encode
and decode
functions to turn
a message into an iolist or turn binary into a message.
Default values work as expected.
Repeated fields are represented as lists.