Packages
protox
0.12.1
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-dev
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
retired
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
A fast, easy to use and 100% conformant Elixir library for Google Protocol Buffers (aka protobuf)
Current section
Files
Jump to
Current section
Files
lib/protox.ex
defmodule Protox do
@moduledoc"""
Use this module to generate the Elixir modules from a set of protobuf definitions:
```
defmodule Foo do
@external_resource "./defs/foo.proto"
@external_resource "./defs/bar.proto"
@external_resource "./defs/baz/fiz.proto"
use Protox, files: [
"./defs/foo.proto",
"./defs/bar.proto",
"./defs/baz/fiz.proto",
]
end
```
Note that the files should reside in the same sub-directory.
It's also possible to directly give a schema:
```
defmodule Bar do
use Protox, schema: \"\"\"
syntax = "proto3";
package fiz;
message Baz {
}
message Foo {
map<int32, Baz> b = 2;
}
\"\"\"
end
```
The generated modules respect the package declaration. For instance, in the above example,
both the `Fiz.Baz` and `Fiz.Foo` modules will be generated.
"""
defmacro __using__(args) do
namespace = case Keyword.get(args, :namespace) do
nil -> nil
n -> n |> Code.eval_quoted() |> elem(0)
end
files = case Keyword.delete(args, :namespace) do
schema: <<text::binary>> ->
filename = "#{__CALLER__.module}_#{:crypto.hash(:sha, text) |> Base.encode16()}.proto"
filepath = Path.join([Mix.Project.build_path(), filename]) |> Path.expand()
File.write!(filepath, text)
[filepath]
files: files ->
files |> Enum.map(&Path.expand/1)
end
{:ok, file_descriptor_set} = Protox.Protoc.run(files)
{enums, messages} = Protox.Parse.parse(file_descriptor_set, namespace)
Protox.Define.define(enums, messages)
end
end