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
endThis 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 150All 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.