Module gpb_compile

Compile protobuf definition files to a module that can encode and decode values to and from binaries.

Description

Compile protobuf definition files to a module that can encode and decode values to and from binaries.

The Erlang types for the values are as follows

Protobuf type Erlang type
double, float float() | infinity | '-infinity' | nan
When encoding, integers, too, are accepted
int32, int64
uint32, uint64
sint32, sint64
fixed32, fixed64
sfixed32, sfixed64
integer()
bool true | false
When encoding, the integers 1 and 0, too, are accepted
enum atom()
unknown enums decode to integer()
message record (thus tuple())
or map() if the maps (-maps) option is specified
string unicode string, thus list of integers
or binary() if the strings_as_binaries (-strbin) option is specified
When encoding, iolists, too, are accepted
bytes binary()
When encoding, iolists, too, are accepted
oneof {ChosenFieldName, Value}
or ChosenFieldName => Value if the {maps_oneof,flat} (-maps_oneof flat) option is specified
map<_,_> An unordered list of 2-tuples, [{Key,Value}]
or a map(), if the maps (-maps) option is specified

Repeated fields are represented as lists.

Optional fields are represented as either the value or undefined if not set. However, for maps, if the option maps_unset_optional is set to omitted, then unset optional values are omitted from the map, instead of being set to undefined when encoding messages. When decoding messages, even with maps_unset_optional set to omitted, the default value will be set in the decoded map.

Data Types

arg()

arg() = term() | named_arg()

arg_template()

arg_template() = [arg()]

bin_ret()

bin_ret() = 
    {ok, module(), code()} | {ok, module(), code(), [warning()]}

boolean_opt()

boolean_opt(X) = X | {X, boolean()}

Just an option X means {X,true}

code()

code() = binary() | gpb_defs:defs() | [code_item()]

code_item()

code_item() = 
    {erl, ErlCode :: binary()} | {nif, NifCcText :: string()}

comp_ret()

comp_ret() = mod_ret() | bin_ret() | defs_ret() | error_ret()

defs_ret()

defs_ret() = 
    {ok, gpb_defs:defs()} | {ok, gpb_defs:defs(), [warning()]}

directory()

directory() = string()

error_ret()

error_ret() = 
    error | {error, reason()} | {error, reason(), [warning()]}

fetcher_ret()

fetcher_ret() = from_file | {ok, string()} | {error, term()}

field_path()

field_path() = [atom() | []]

filename()

filename() = string()

fn_name()

fn_name() = atom()

gpb_field_type()

gpb_field_type() = 
    int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 |
    fixed64 | sfixed32 | sfixed64 | bool | float | double |
    string | bytes |
    {enum, atom()} |
    {msg, atom()} |
    {group, atom()} |
    {map, gpb_map_key(), gpb_map_value()}

gpb_map_key()

gpb_map_key() = 
    int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 |
    fixed64 | sfixed32 | sfixed64 | bool | string

gpb_map_value()

gpb_map_value() = gpb_scalar() | {enum, atom()} | {msg, atom()}

gpb_scalar()

gpb_scalar() = 
    int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 |
    fixed64 | sfixed32 | sfixed64 | bool | float | double |
    string | bytes

import_fetcher_fun()

import_fetcher_fun() = fun((string()) -> fetcher_ret())

io_info_item()

io_info_item() = 
    {erl_output, filename()} |
    {hrl_output, filename()} |
    {nif_cc_output, filename()} |
    {sources, [source()]} |
    {missing, [source()]}

json_array_format()

json_array_format() = list | {atom(), list}

A list or a list in a tagged tuple.

json_format()

json_format() = jsx | mochijson2 | jiffy | maps

Convenience shorthand to specify object, key, array and string and null format.

json_key_format()

json_key_format() = atom | binary | string

json_object_format()

json_object_format() = 
    eep18 | {proplist} | {atom(), proplist} | map

json_string_format()

json_string_format() = binary | list

list_deps_format()

list_deps_format() = 
    makefile_format |
    {list_imports, newline_terminated} |
    {list_imports, null_terminated}

list_deps_makefile_target()

list_deps_makefile_target() = string() | {quote, string()}

mod_fn_argtemplate()

mod_fn_argtemplate() = {module(), fn_name(), arg_template()}

mod_ret()

mod_ret() = ok | {ok, [warning()]}

msg_name_change()

msg_name_change() = 
    name_change() | {prefix, {by_proto, prefix_by_proto()}}

name_change()

name_change() = 
    {prefix, string() | atom()} |
    {suffix, string() | atom()} |
    lowercase | snake_case | dots_to_underscores | base_name

named_arg()

named_arg() = '$1' | '$2' | '$errorf' | '$user_data' | '$op'

opt()

opt() = 
    type_specs |
    {type_specs, boolean()} |
    {verify, optionally | always | never} |
    {copy_bytes, true | false | auto | integer() | float()} |
    {strings_as_binaries, boolean()} |
    strings_as_binaries |
    boolean_opt(defs_as_proplists) |
    boolean_opt(descriptor) |
    boolean_opt(maps) |
    boolean_opt(msgs_as_maps) |
    boolean_opt(mapfields_as_maps) |
    boolean_opt(defs_as_maps) |
    {maps_unset_optional, omitted | present_undefined} |
    {maps_oneof, tuples | flat} |
    {maps_key_type, atom | binary} |
    boolean_opt(nif) |
    {load_nif, string()} |
    {i, directory()} |
    {o, directory()} |
    {o_erl, directory()} |
    {o_hrl, directory()} |
    {o_nif_cc, directory()} |
    binary | to_proto_defs | to_msg_defs | return |
    boolean_opt(return_warnings) |
    boolean_opt(return_errors) |
    report |
    boolean_opt(report_warnings) |
    boolean_opt(report_errors) |
    boolean_opt(warnings_as_errors) |
    boolean_opt(include_as_lib) |
    boolean_opt(use_packages) |
    {erlc_compile_options, string()} |
    {rename, renaming()} |
    {msg_name_prefix,
     string() | atom() | {by_proto, prefix_by_proto()}} |
    {msg_name_suffix, string() | atom()} |
    boolean_opt(msg_name_to_snake_case) |
    boolean_opt(msg_name_to_lower) |
    {module_name_prefix, string() | atom()} |
    {module_name_suffix, string() | atom()} |
    {module_name, string() | atom()} |
    {translate_type, {gpb_field_type(), [translation()]}} |
    {translate_field, {field_path(), [translation()]}} |
    {any_translate, [translation()]} |
    boolean_opt(epb_compatibility) |
    boolean_opt(epb_functions) |
    boolean_opt(defaults_for_omitted_optionals) |
    boolean_opt(type_defaults_for_omitted_optionals) |
    {import_fetcher, import_fetcher_fun()} |
    {target_erlang_version, integer() | current} |
    boolean_opt(bypass_wrappers) |
    boolean_opt(json) |
    boolean_opt(json_always_print_primitive_fields) |
    boolean_opt(json_preserve_proto_field_names) |
    boolean_opt(json_case_insensitive_enum_parsing) |
    {json_format, json_format()} |
    {json_object_format, json_object_format()} |
    {json_key_format, json_key_format()} |
    {json_array_format, json_array_format()} |
    {json_string_format, json_string_format()} |
    {json_null, atom()} |
    boolean_opt(gen_mergers) |
    boolean_opt(gen_introspect) |
    boolean_opt(ignore_wellknown_types_directory) |
    {proto_defs_version, integer()} |
    {introspect_proto_defs_version, integer() | preferably_1} |
    {list_deps, list_deps_format()} |
    {list_deps_dest_file, filename()} |
    boolean_opt(list_deps_missing_imports_are_generated) |
    boolean_opt(list_deps_makefile_phonies) |
    {list_deps_makefile_target, list_deps_makefile_target()} |
    boolean_opt(list_deps_ang_generate) |
    term()

opts()

opts() = [opt()]

prefix_by_proto()

prefix_by_proto() = 
    [{ProtoName :: atom(), Prefix :: string() | atom()}]

reason()

reason() = term()

renaming()

renaming() = 
    {pkg_name, name_change()} |
    {msg_name, msg_name_change()} |
    {msg_fqname, msg_name_change()} |
    {group_name, name_change()} |
    {group_fqname, name_change()} |
    {service_name, name_change()} |
    {service_fqname, name_change()} |
    {rpc_name, name_change()} |
    {msg_typename, name_change()} |
    {enum_typename, name_change()}

source()

source() = 
    from_input_string |
    {from_fetched, Proto :: filename()} |
    filename()

translation()

translation() = 
    {encode, mod_fn_argtemplate()} |
    {decode, mod_fn_argtemplate()} |
    {decode_init_default, mod_fn_argtemplate()} |
    {decode_repeated_add_elem, mod_fn_argtemplate()} |
    {decode_repeated_finalize, mod_fn_argtemplate()} |
    {merge, mod_fn_argtemplate()} |
    {verify, mod_fn_argtemplate()} |
    {type_spec, string()}

warning()

warning() = term()

Function Index

c/0Command line interface for the compiler.
c/1This function is intended as a command line interface for the compiler.
c/2
file/1Equivalent to file(File, []).
file/2 Compile a .proto file to a .erl file and to a .hrl file.
format_error/1Produce a plain-text error message from a reason returned by for instance file/2 or proto_defs/2.
format_warning/1Produce a plain-text error message from a reason returned by for instance file/2 or proto_defs/2.
list_io/2List inputs and file outputs, based on an input file.
locate_import/2Locate an import target.
msg_defs/2Deprecated, use proto_defs/2 instead.
msg_defs/3Deprecated, use proto_defs/2 instead.
parse_opts_and_args/1
proto_defs/2Equivalent to proto_defs(Mod, Defs, []).
proto_defs/3 Compile a list of pre-parsed definitions to file or to a binary.
proto_defs/5 Compile a list of pre-parsed definitions to file or to a binary.
read_import/2Read an import file.
show_args/0
show_version/0
string/2Equivalent to string(Mod, Str, []).
string/3 Compile a .proto file as string.
string_list_io/2Equivalent to string_list_io(Mod, Str, []).
string_list_io/3List inputs and file outputs based on proto definitions in a string instead of in a file, similar to string/3.

Function Details

c/0

c() -> no_return()

Command line interface for the compiler. With no proto file to compile, print a help message and exit.

c/1

c(Files :: [string() | atom()]) -> no_return()

This function is intended as a command line interface for the compiler. Call it from the command line as follows:

     erl <erlargs> [gpb-opts] -s gpb_compile c File.proto ...
     erl <erlargs> -s gpb_compile c File.proto ... -extra [gpb-opts]

The <erlargs> can be -noshell -noinput +B -boot start_clean -pa SomeDir

The options below are supported. Dashes and underscores inside option names are equivalent, ie -o-erl and -o_erl are the same option.
-IDir -I Dir
Specify include directory. Option may be specified more than once to specify several include directories.
-o Dir
Specify output directory for where to generate the ProtoFile.erl and ProtoFile.hrl
-o-erl Dir | -o-hrl Dir | -o-nif-cc Dir
Specify output directory for where to generate the ProtoFile.erl and ProtoFile.hrl respectively, and for the NIF C++ file, if the -nif option is specified. The -o-erl Dir option overrides any -o Dir option, and similarly for the other file-type specific output options.
-v optionally | always | never
Specify how the generated encoder should verify the message to be encoded.
-nif
Generate nifs for linking with the protobuf C(++) library.
-load_nif FunctionDefinition
Specify FunctionDefinition as the text that defines the function load_nif/0. This is called as the on_load hook for loading the NIF. See also the doc for the load_nif option in the file/2 function.
-c true | false | auto | integer() | float()
Specify how or when the generated decoder should copy fields of type bytes. See the copy_bytes option for the function file/2 for more info.
-strbin
Specify that decoded strings should be returned as binaries, instead of as strings (lists).
-pldefs
Specify that introspection functions shall return proplists instead of #field{} records, to make the generated code completely free of even compile-time dependencies to gpb.
-pkgs
Prepend the name of a package to every message it contains. If no package is defined, nothing will be prepended. Default is to not prepend package names for backwards compatibility, but it is needed for some proto files.
-translate_type TMsFs
Call functions in TMsFs to pack, unpack, merge and verify for the specifed type. The TMsFs is a string on the following format: type=Type,e=Mod:Fn,d=Mod:Fn[,m=Mod:Fn][,V=Mod:Fn]. The Type and specified modules and functions are called and used as follows:
type=Type
Specfies that the translations apply to fields of type. The Type may be either of: msg:MsgName (after any renaming operations), enum:EnumName, int32, int64, uint32, uint64, sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, double, string, bytes or map<KeyType,ValueType>. The last may need quoting in the shell.
e=Mod:Fn
Call Mod:Fn(Term) to pack the Term to a value of type Type, ie to a value that gpb knows how to wire-encode.
d=Mod:Fn
Call Mod:Fn(Value) to unpack the just wire-decoded Value of type Type, to something of your choice.
m=Mod:Fn
Call Mod:Fn(Term1, Term2) -> Term3 to merge two unpacked terms to a resulting Term3. Note that this function is never called for scalar types.
V=Mod:Fn
Call Mod:Fn(Term) -> _ to verify an unpacked Term. If Term is valid, the function is expected to just return any value, which is ignored and discarded. If Term is invalid, the function is exptected to not return anything, but instead either crash, call erlang:error/1, or throw/1 or exit/1 with the reason for error. If you want to use a verifier, this is the new preferred approach.
v=Mod:Fn
Call Mod:Fn(Term, ErrorF) -> _ to verify an unpacked Term. This exists for backwards compatibility, and its use is deprecated.
-translate_field FMsFs
Call functions in FMsFs to pack, unpack, merge, and verify. This is similar to the -translate_type option, except that a message field is specified instead of a type. The FMsFs is a string on the following format: field=Path,e=...,d=...,m=...,V=...[,i=Mod:Fn][,a=Mod:Fn][,f=Mod:Fn] See the -translate_type option for info on e=, d=, m= and V= items. Additionally for this -translate_field option, these exist:
field=Path
The Path indicates the element to translate as follows:
  • MsgName for the message itself. (This is actually equivalent to -translate_type type=msg:MsgName,...)
  • MsgName.FieldName for fields generally
  • MsgName.OneofName.FieldName for oneof fields
  • MsgName.FieldName.[] for elements of repeated fields
i=Mod:Fn
For repeated fields, call Mod:Fn() on decoding to initialize the field to some value
a=Mod:Fn
For repeated fields, call Mod:Fn(Elem,S) on decoding to add an item)
f=Mod:Fn
For repeated fields, call Mod:Fn(S) on decoding to finalize the field
-any_translate MsFs
Call functions in MsFs to pack, unpack, merge and verify google.protobuf.Any messages. The MsFs is a string on the following format: e=Mod:Fn,d=Mod:Fn[,m=Mod:Fn][,V=Mod:Fn]. See the translate option for details on the string components.
-msgprefix Prefix
Prefix each message with Prefix. This can be useful to when including different sub-projects that have colliding message names.
-modprefix Prefix
Prefix each module with Prefix. Normally the module name of the generated code is based on the name of the .proto file. This option prepends a prefix to the module name, which can be useful when including different sub-projects that have colliding proto file names.
-msgsuffix Suffix
Suffix each message name with Suffix.
-modsuffix Suffix
Suffix each module name with Suffix.
-modname Name
Specify the name of the generated module.
-msgtolower
ToLower each message. Any prefixes/suffixes are added after case modification.
-rename What:How
The following What values are available:
pkg_name
Modify the package name. Useful with the -pkgs option.
msg_name
Modify message names, but not the package part of them
msg_fqname
Modify message names, including their package parts. Useful with the -pkgs option.
group_name
Group names.
group_fqname
Group names including their package parts.
service_name
Service names.
service_fqname
Service names including their package parts.
rpc_name
The RPC name.
msg_typename
Erlang type names for messages and groups.
enum_typename
Erlang type names for enums.
The following How values are available:
prefix=Prefix
Prepend the Prefix to the beginning of the name.
suffix=Suffix
Append the Suffix to the end of the name.
lower_case
Example: from MsgName to msgname
snake_case
Example: from MsgName to msg_name
dots_to_underscores
Example: from Msg.Sub to Msg_Sub
base_name
Example: from Domain.Pkg.Msg to Msg
proto=Proto:prefix=Prefix[,...]
For each message belonging the the .proto Proto, without the .proto suffix, prepend Prefix to the beginning of the name. This only works for msg_name and msg_fqname.
It is possible to specify more than one -rename option, and they are applied in the order specified.
-il
Generate code that include gpb.hrl using -include_lib instead of -include, which is the default.
-type
-no_type
Enables or disables ::Type() annotations in the generated code. Default is to enable if there are no cyclic dependencies.
-descr
Generate self-description information.
-maps
This option expands to the following options: See the maps option for the function file/2 for more info.
-maps_unset_optional omitted | present_undefined
Specifies the internal format for optional fields that are unset.
-maps_oneof tuples | flat
Specifies the internal format for oneof fields in maps. (Requires -maps and -maps_unset_optional omitted, of which the latter is default since 4.0.0.)
-maps_key_type atom | binary
Specifies the key type for maps.
-msgs-as-maps
Specifies that messages should be maps. No .hrl file will be generated. Without this option, messages will be records.
-mapfields-as-maps
Specifies that fields of type map<_,_> should be maps. Otherwise, they will be 2-tuples.
-defs-as-maps
Specifies that proto defintions from the generated code are to be returned as maps. Otherwise, they will be lists of tuples and records (or proplists if the -pldefs option is specified)
-erlc_compile_options Options
Specifies compilation options, in a comma separated string, to pass along to the -compile(...) directive on the generated code.
-epb
Enable compatibility with the Erlang Protobuffs library:
-epb-functions
For compatibility with the Erlang Protobuffs library, generate also the following functions: encode/1, decode/2, encode_MsgName/1 and decode_MsgName/1
-defaults-for-omitted-optionals
For optional fields not present on decoding, set the field to its default value, if any, instead of to undefined.
-type-defaults-for-omitted-optionals
For optional fields not present on decoding, set the field to its type-default, instead of to undefined.
-for-version N
Generate code for Erlang/OTP version N instead of current.
-bypass-wrappers
Bypass wrappers.
-json
Generate functions for converting to and from a JSON representation.
-json-format jsx | mochijson2 | jiffy | maps
Specify format for the JSON representation. maps is default if the -maps option is specified, otherwise the jsx format is default.
-json-object-format eep18 | tpl | tpl:Tag | map
Specify JSON object format:
-json-key-format binary | atom | string
Specify JSON object key format. binary is the default.
-json-array-format list | tl:Tag
Specify JSON object array format.
-json-string-format binary | list
Specify JSON string format. binary is the default.
-json-null Null
Specify JSON null value, null is the default.
-json-always-print-primitive-fields
Print also fields whose value is their type's default.
-json-preserve-proto-field-names
Print the fields' names as in .proto file, not as lowerCamelCase.
-json-case-insensitive-enum-parsing
Make case insignificant when parsing enums in JSON. Also allow dash as alternative to undercore. Default is that case is significant when parsing enums.
-no-gen-mergers
Do not generate code for merging of messages. This is only useful with the option -nif.
-no-gen-introspect
Do not generate code for introspection.
-Werror, -W1, -W0, -W, -Wall
-Werror means treat warnings as errors
-W1 enables warnings, -W0 disables warnings.
-W and -Wall are the same as -W1
-M
Generate Makefile rule(s) to stdout for dependencies. No code is generated unless -MMD is specified.
-ML
Print imports, on per line instead of on Makefile format. No code is generated unless -MMD is specified.
-M0
Print imports, each terminated by a null character, instead of on Makefile format. No code is generated unless -MMD is specified.
-MF file
Specify a file to write dependency rules to, instead of printing them to stdout. No code is generated unless -MMD is specified.
-MG
Consider missing imports to be generated and include\n" them in the listed dependencies or rules.
-MP
Generate phony Makefile targets for dependencies.
-MT target
Override the Makefile rule target.
-MQ target
Same as -MT but quote characters special to make.
-MMD
List imports or Makefile rules and generate code. This option works like in erlc, which contrasts to gcc.
--help or -h
Show help.
--version or -V
Show the version number of gpb.
If several files are specified, each is compiled individually, no checking is done for instance for multiply defined messages or fields across files, such as the protoc does.

c/2

c(Opts :: opts(), Args :: [ProtoFileName :: string()]) ->
     no_return()

file/1

file(File :: string()) -> comp_ret()

Equivalent to file(File, []).

file/2

file(File :: string(), Opts :: opts()) -> comp_ret()

Compile a .proto file to a .erl file and to a .hrl file.

The File argument must not include path to the .proto file. Example: "SomeDefinitions.proto" is ok, while "/path/to/SomeDefinitions.proto" is not ok.

The .proto file is expected to be found in a directories specified by an {i,directory()} option. It is possible to specify {i,directory()} several times, they will be searched in the order specified.

The type_specs option enables or disables ::Type() annotations in the generated .hrl file. Default is true. The default changed in gpb version 4.0.0. Previously, the default was false. If you have messages referencing other messages cyclically, and get into troubles when compiling the generated files, set this to false.

The verify option specifies whether or not to generate code that verifies, during encoding, that values are of correct type and within range. The verify option can have the following values:
always
Generate code that unconditionally verifies values.
never
Generate code that never verifies values time. Encoding will fail if a value of the wrong type is supplied. This includes forgetting to set a required message field. Encoding may silently truncate values out of range for some types.
optionally
Generate an encode_msg/2 that accepts the run-time option verify or {verify,boolean()} for specifying whether or not to verify values.

Erlang value verification either succeeds or crashes with the error {gpb_type_error,Reason}. Regardless of the verify option, a function, verify_msg/1 is always generated.

The copy_bytes option specifies whether when decoding data of type bytes (or strings if the strings_as_binaries is set), the decoded bytes should be copied or not. Copying requires the binary module, which first appeared in Erlang R14A. When not copying decoded bytes, they will become sub binaries of the larger input message binary. This may tie up the memory in the input message binary longer than necessary after it has been decoded. Copying the decoded bytes will avoid creating sub binaries, which will in turn make it possible to free the input message binary earlier. The copy_bytes option can have the following values:
false
Never copy bytes/(sub-)binaries.
true
Always copy bytes/(sub-)binaries.
auto
Copy bytes/(sub-)binaries if the beam vm, on which the compiler (this module) is running, has the binary:copy/1 function. (This is the default)
integer() | float()
Copy the bytes/(sub-)binaries if the message this many times or more larger than the size of the bytes/(sub-)binary.

The strings_as_binaries option specifies whether strings should be returned from decoding as strings (list of Unicode code points), or as binaries (UTF-8 encoded). The copy_bytes option applies to strings as well, when the strings_as_binaries option is set. Upon encoding, both binaries and iolists are accepted.

The defs_as_proplists option changes the generated introspection functions find_msg_def and get_msg_defs to return the description of each message field as a proplist, instead of as a #field{} record. The purpose is to make the generated code completely independent of gpb, at compile-time (it is already independent at run-time). The keys of the proplist are the names of the record fields in the #field{} record. See also gpb:proplists_to_field_records() and related functions for conversion functions between these two formats.

The descriptor option specifies whether or not to generate a function, descriptor/0, which returns a binary that describes the proto file(s) contents according to the protobuf's descriptor.proto. The default is to not generate such a description. The generated description binary is most likely not identical to what protoc would generate, but the contents is roughly equivalent.

The {o,directory()} option specifies directory to use for storing the generated .erl and .hrl files. Default is the same directory as for the proto File.

The {o_erl,directory()}, {o_hrl,directory()}, {o_nif_cc,directory()}, options specify output directories for where to generate the .erl and .hrl files respectively, and for the NIF C++ file, if the nif option is specified. The {o_erl,directory()} option overrides any {o,directory()} option, and similarly for the other file-type specific output options.

The maps option will generate a protobuf encoder/decoder that uses maps instead of records. This option expands to the following options:
msgs_as_maps
No .hrl file will be generated, and the functions encode_msg, merge_msgs and verify_msg will take the message name as an additional parameter.
mapfields_as_maps
The value for fields of type map<_,_> will be a map instead of a list of 2-tuples.
defs_as_maps
The introspection will generate message field descriptions as maps instead of as #field{} records, unless, of course defs_as_proplists is specified, in which case they will be proplists instead.
For messages as maps, for optional fields, if not set, the maps_unset_optional option specifies the Erlang-internal representation; both how it is expected to be found at encoding, and how decoding will return it, for proto2 syntax:
omitted
This means it is not included in the map. This is the default. (since gpb version 4.0.0)
present_undefined
This means it is present and has the value undefined. This was the default before gpb version 4.0.0.

For proto3 syntax, the scene is a bit different. In proto3 all fields are kind-of optional, but omitted scalar fields, strings and bytes decode to their type-default. On encoding with proto3, a field that has its type-default value is not included in the encoded binary, so one could say that even though all fields are optional, in a conceptual way, all scalars, strings and bytes always have a value. The exceptions are sub-messages and oneof fields, and for these fields, this option has the meaning as indicated above.

The maps_oneof option can be used for messages as maps, and can only take effect if maps_unset_optional is omitted (default since 4.0.0). It changes the representation of oneof fields as described below, if we would have a oneof-field, xf with two alternatives a1 and a2:
{maps_oneof,tuples}
#{xf => {a1, Value}} or #{xf => {a2, Value}}
{maps_oneof,flat}
#{a1 => Value} or #{a2 => Value}

For messages as maps, the maps_key_type option makes it possible to control whether keys should be atoms (default) or binaries.

The nif option will cause the compiler to generate nif C++ code for encoding and decoding. The generated nif C++ code can be linked with the Google protobuf C++ library. Read the file README.nif-cc for more info.

The binary option will cause the generated and compiled code to be returned as a binary. No files will be written. The return value will be on the form {ok,Mod,Code} or {ok,Mod,Code,Warnings} if the compilation is successful. This option may be useful e.g. when generating test cases. In case the nif option is set, the Code will be a list of tuples: {erl,binary()} which contains the Erlang object byte code, and {nif,binary()} which contains the C++ code. You will have to compile the C++ code with a C++ compiler, before you can use the Erlang code.

The to_proto_defs option will result in {ok,Defs} or {ok,Defs,Warns} being returned if the compilation is successful. The returned message definitions can be used with the proto_defs/2 or proto_defs/3 functions.

The to_msg_defs option is a deprecated alias for to_proto_defs.

report_errors/report_warnings
Causes errors/warnings to be printed as they occur.
report
This is a short form for both report_errors and report_warnings.
return_errors
If this flag is set, then {error,ErrorList,WarningList} is returned when there are errors.
return_warnings
If this flag is set, then an extra field containing WarningList is added to the tuples returned on success.
return
This is a short form for both return_errors and return_warnings.

Setting the warnings_as_errors option will cause warnings to be treated as errors. If there are warnings but no errors, and return_warnings is not specified, then error will be returned.

See format_error/1 for a way to turn an error Reason to plain text.

If the include_as_lib option is set, the generated code will include gpb.hrl as a library, which is necessary if dependencies are managed with Rebar. Otherwise, the header file is included directly and must be located in the path, which is default behavior.

The use_packages option instructs gpb to prepend the name of a package to every message it contains. If no package is defined, nothing will be prepended. This enables the reference of messages in other packages which would otherwise not be possible. However, for reasons of backward compatibility, this option is disabled by default.

If the the {erlc_compile_options,string()} option is set, then the genereted code will contain a directive -compile([String]).

The {rename,{What,How}} can transform message names, package names, service and rpc names in various ways. This option supersedes the options {msg_name_prefix,Prefix}, {msg_name_suffix,Suffix}, msg_name_to_lower and msg_name_to_snake_case, while at the same time giving more fine-grained control. It is for example possible to apply snake_casing only to the message name, while keeping the package name, the service name and the rpc name intact. This can be useful with grpc, where these name components are exposed. The msg_fqname refers to the fully qualified message name, as in Package.MsgName, while the msg_name refers to just the message name without package. The service_fqname and service_name specifiers work analogously. The enum_typename and msg_typename operate on any enum or msg renamings already applied.

It is possible to stack rename options, and they will be applied in the order they are specified. So it is for example possible to snake_case a name, and then also prefix it.

The {msg_name_prefix,Prefix} will add Prefix (a string or an atom) to each message. This might be useful for resolving colliding names, when incorporating several protocol buffer definitions into the same project. The {msg_name_suffix,Suffix} works correspondingly.

The {msg_name_prefix,Prefix} option expands to [{rename,{pkg_name,Prefix}},{rename,{msg_fqname,{prefix,Prefix}}}, {rename,{group_fqname,{prefix,Prefix}}}}], and ditto for suffixes.

For backwards compatibility, the {msg_name_prefix,{by_proto,PrefixList}} expands to just [{rename,{msg_fqname,{prefix,PrefixList}}}].

The msg_name_to_lower and msg_name_to_snake_case options expands to [{rename,{pkg_name,X}},{rename,{service_fqname,X}}, {rename,{rpc_name,X}},{rename,{msg_fqname,X}}, {rename,{rpc_name,X}},{rename,{group_fqname,X}}] where X is lowercase or snake_case respectively.

The {module_name_prefix,Prefix} will add Prefix (a string or an atom) to the generated code and definition files. The {module_name_suffix,Suffix} works correspondingly. For the case of compatibility with Erlang Protobuffs, the epb_compatibility option implies {module_name_suffix,"_pb"}

The {module_name,Name} can be used to specify the module name of the generated code freely, instead of basing it on the proto file name. The name specified with module_name can be prefixed and suffixed with the module_name_prefix and module_name_suffix options.

The translate_type option can be used to provide packer and unpacker functions for message fields of a certain type. For messages, the MsgName refers to a name after renaming has taken place. The merge translator is optional, and is called either via the merge_msgs function in the generated code, or when the decoder sees another field of the same type. The default merge operation is to let the second element overwrite previous elements. The verify translator is optional too, since verification can be disabled. The translation calls are specified as {Mod,Fn,ArgTemplate} where Mod,Fn is a module and function to call, ArgTemplate is a list of terms, containing markers, such as $1, $2 and so on, for where to place the actual args. This makes it possible to specify additional static argument terms, for instance. The translator functions are called as follows:
Encode (Packing)
Call Mod:Fn(Term) to pack the Term ($1) to a value of the suitable for normal gpb encoding.
Decode (Unpacking)
Call Mod:Fn(Any) to unpack the Any ($1) to unpack a normal gpb decoded value to a term.
Merge
Call Mod:Fn(Term1, Term2) -> Term3 to merge two unpacked terms to a resulting Term3. The $1 is the previously seen term (during decoding, on encountering a second field of the same type), or the first argument to the merge_msgs function. The $2 is the lastly seen term, or the second argument to the merge_msgs function.
Verify
Call Mod:Fn(Term) -> _ to verify an unpacked Term. If Term ($1) is valid, the function is expected to just return any value, which is ignored and discarded. If Term is invalid, the function is exptected to not return anything, but instead either crash, call erlang:error/1, or throw/1 or exit/1. with the reason for error. (For backwards compatibility, it is also possible to have an error function as argument, using $errorf, but this is deprecated.)
There are additional translator argument markers:
$user_data
This will be replaced by the user_data option to the generated encode_msg, decode_msg, merge_msgs and verify_msg functions. If that option is not specified, the value undefined is used substituted for $user_data.
$op
This will be replaced by encode, decode, merge, verify, decode_init_default, decode_repeated_add_elem or decode_repeated_finalize, depending on from which context it is actually called. This can be useful because if the message is to be verified on encoding (see the verify option), then the same options, and thus the same user-data, are used for both encode_msg and for verify_msg. The $op marker makes it possible to tell these two call sites apart, if needed.

The option {any_translate,Translations} is retained for backwards compatibility, and expands to {translate_type,{'google.protobuf.Any',Translations}}.

The translate_field option can be used to translate individual fields. The option format is {translate_field,{FieldPath,Translations}} where each Translation consists of {Op,{Mod,Fn,ArgTemplate}} elements, just as for translate_type. The FieldPath is a list on the following format:

For repeated fields, the additional operations decode_init_default, decode_repeated_add_elem and decode_repeated_finalize also exist and must all be specified.

For translated proto3 message fields -- ie fields for messages in files with syntax="proto3"; -- the decode callback will be invoked also initially when the decoding of the message binary is about to start. This holds for non-repeated non-oneof fields of integer types, enums, strings and bytes. The decode callback will be invoked with the type's default value. This is because in proto3, a field with the type's default value is never included in the resulting wire octets, so on decoding, gpb initially assumes such fields have the type's default value, and the translator needs to be invoked accordingly.

The epb_compatibility option is an umbrella-option for compatibility with the Erlang protobuffs library. It will expand to the options below. It will expand in-place, meaning any of these can be overridden if specified before the epb_compatibility option. If the epb_functions option is specified, then for compatibility with Erlang protobuffs, the following functions will be generated:

The defaults_for_omitted_optionals and type_defaults_for_omitted_optionals options generates code that set default values or type-defaults respectively, on decoding, if an optional field is not present in the binary to decode. Normally it would otherwise have been set to undefined. Note that with these options it is not possible to determine after decoding whether a field contained data in the binary message. Also note that these options are only applicable for proto2 syntax messages, and are ignored for proto3 syntax messages. (For proto3, it effectively must be ignored, since, on the wire, a field set to its type-default value is indistinguishable from an omitted value.)

The import_fetcher option can be used to catch imports. The option value must be a function taking one argument, the name of the file to import. It must return either from_file, letting this file pass through the normal file import, or {ok,string()} if it has fetched the file itself, or {error,term()}.

The target_erlang_version can be used to specify another major version of Erlang/OTP to generate code for. The default, current means that the generated code is expected to be compiled and run on the same major version as gpb runs on.

The bypass_wrappers option exposes the more-or-less internal top-level encode and decode functions without wrappers. The list below describe what functionality the wrappers provide. The main purpose of being able to bypass the wrappers is performance, especially when combined with the nif option. This option causes the following extra functions to be exported:
For encode, the wrapper takes care of:
For decode, the wrapper takes care of:

The json option will cause gpb to also generate functions for converting between internal format and a JSON representation.

Note that gpb will not encode to an actual JSON text. Instead, it returns an erlang structure that can be used with some other JSON library to turn it into actual JSON text. Ditto for decoding. It is possible to flexibly specify details of the JSON representation, with shorthand presets for some common libraries.

However, with the nif option, the generated code uses the Google C++ protobuf library, which produces already-formatted JSON text, as binaries, with no further processing required. When nif is specified, the various JSON format options are thus not used. The json_always_print_primitive_fields, the json_preserve_proto_field_names and the json_case_insensitive_enum_parsing options are honoured with nif, though.

The json_always_print_primitive_fields makes the generated to_json function always emit json key-value items also when the value is the type's default value. The default is to omit such values, as per the language guide. This holds for messages in files with proto3 syntax.

The json_preserve_proto_field_names makes the generated to_json function always use the field name in the .proto file. The default is to use lowerCamelCase, as per the language guide.

If the the json_case_insensitive_enum_parsing option is specified, case is not significant when parsing json enums. Also, dashes instead of underscores are allowed. Default is that that case is significant.

The {json_format,Format} option is a convenience shorthand, and will expand as indicated below. If the json_format is not specified, it defaults to map if the maps option is specified, and otherwise to eep18 when generating code for records.
jsx
[{json_object_format, eep18}, {json_key_format, binary}, {json_array_format, list}, {json_string_format, binary}, {json_null, null}]
mochijson2
[{json_object_format, {struct, proplist}}, {json_key_format, binary}, {json_array_format, list}, {json_string_format, binary}, {json_null, null}]
jiffy
[{json_object_format, {proplist}}, {json_key_format, binary}, {json_array_format, list}, {json_string_format, binary}, {json_null, null}]
map
[{json_object_format, map}, {json_key_format, binary}, {json_array_format, list}, {json_string_format, binary}, {json_null, null}]
The {json_object_format,Format} option specifies the format of json object, as indicated below. (Note that the format of the keys is specified by the json_object_key option, see further below.)
eep18
The empty json object is represented as [{}].
Non-empty json objects are represented as proplists.
{proplist}
A json object is represented as a proplist in a tuple.
{atom(), proplist}
A json object is represented as a proplist in a tagged tuple, with the possibility to specify the tag.
map
The json object is represented as an Erlang map.
The {json_key_format,Format} option specifies the format of json object keys, as follows: The {json_array_format,Format} option specifies the format of json arrays, as follows: The {json_string_format,Format} option specifies the format of json arrays, as follows:

The {json_null,atom()} option specifies the atom to use for the JSON null value. The default is to use the atom null.

The {gen_mergers,false} option will cause gpb to not generate code for merging of messages. This is only useful with the option nif. One rationale for this is option is to reduce the size of the generated code.

The {gen_introspect,false} option will cause gpb to not generate code for introspection. One rationale for this is option is to reduce the size of the generated code.

The {ignore_wellknown_types_directory, true} option will stop gpb from looking rom a well known types directory by trying to locate the priv directory of the gpb application. This can be used either when this directory is not available or to provide a custom set of well known types.

The proto_defs_version can be used to specify version of definitions returned with the to_proto_defs option. See the file doc/dev-guide/proto-defs-versions.md for some more info. Not all proto definitions may be expressible in all versions. In gpb-4.x.y it defaults to 1. The introspect_proto_defs_version can be used to specify the version returned by the generated introspection functions, default is 1 if possible, else 2.

A set of options will cause file/2 and string/3 to list import dependencies as described below. To retrieve dependency information as Erlang terms, see list_io/2 and string_list_io/3.
{list_deps, Format}
{list_deps_dest_file, Filename::string()}
Either or both of these two options without the list_deps_and_generate option described below, will cause dependencies to be listed, and no code to be generated. The default format is Makefile format, ie with only the list_deps_dest_file option. The default destination is to print to standard output, ie with only the list_deps option.
list_deps_and_generate
If specified, dependencies will be listed, and code will be generated. .
Formats:
{list_deps, makefile_format}
Makefile rules will be generated. The top-level .proto file will be the first dependency followed by imported .proto files, and the .erl file will be the target. Outdir options as well as module renaming options are considered for target. Include path options are considered for the dependencies.
{list_deps, {list_imports, newline_terminated}}
Imports of the .proto file will be listed, one per line.
{list_deps, {list_imports, null_terminated}}
Like newline_terminated but instead, each import is followed by a NUL character. This can be useful when paths have spaces or newline or other strange characters.
list_deps_missing_imports_are_generated
Consider missing imports to be generated, and include them in the dependency list
Some of the options apply only when the Target is makefile_format:
{list_deps_makefile_target, Target}
Override the default target for the Makefile rule, as follows:
Target :: string()
Use the specified value instead.
Target :: {quote, string()}
Same, but quote characters special to make.
list_deps_makefile_phonies
Generate phony Makefile targets for dependencies.

format_error/1

format_error(Reason :: {error, Reason} | Reason) -> io_list()

Produce a plain-text error message from a reason returned by for instance file/2 or proto_defs/2.

format_warning/1

format_warning(X :: warning()) -> iolist()

Produce a plain-text error message from a reason returned by for instance file/2 or proto_defs/2.

list_io/2

list_io(FileName :: filename(), Opts :: opts()) ->
           [io_info_item()]

List inputs and file outputs, based on an input file. The elements erl_output, hrl_output and nif_cc_output are present if output would be generated to those based on the options. The file is scanned for import "file.proto"; declarations recursively.

The imported files are located the same way file/2 would find them, using the options for instance {i,directory()}.

If there is an error parsing the input proto file or an imported file, it is treated as it it was a file with no imports. Thus it is still included in sources. If a file in an import declaration cannot be found, it is included among the missing items.

The first element in sources is always the input file. The rest of the elements are any imported files in breadth-first order. An imported file is in sources only once, even if it is imported multiple times.

Any renaming options are used to compute the output file names. Any import fetcher options are used to retrieve files.

locate_import/2

locate_import(ProtoFileName :: string(), Opts :: opts()) ->
                 {ok, File :: string()} | {error, reason()}

Locate an import target. This function might be potentially useful for instance in an intercepting import_fetcher fun that just wants to record the accessed imports.

msg_defs/2

msg_defs(Mod :: module(), Defs :: gpb_defs:defs()) -> comp_ret()

Equivalent to msg_defs(Mod, Defs, []).

Deprecated, use proto_defs/2 instead.

msg_defs/3

msg_defs(Mod, Defs, Opts) -> CompRet

Equivalent to proto_defs(Mod, Defs, Opts).

Deprecated, use proto_defs/2 instead.

parse_opts_and_args/1

parse_opts_and_args(Argv :: [string()]) ->
                       {ok, {opts(), Args :: [string()]}} |
                       {error, Reason :: string()}

proto_defs/2

proto_defs(Mod :: module(), Defs :: gpb_defs:defs()) -> comp_ret()

Equivalent to proto_defs(Mod, Defs, []).

proto_defs/3

proto_defs(Mod :: module(),
           Defs :: gpb_defs:defs(),
           Opts :: opts()) ->
              comp_ret()

Compile a list of pre-parsed definitions to file or to a binary. See file/2 for information on options and return values.

proto_defs/5

proto_defs(Mod, Defs, DefsNoRenamings, Renamings, Opts) -> any()

Compile a list of pre-parsed definitions to file or to a binary. This is useful when there are renamings, and one nifs or descriptors are to be generated, since these need the original definitions before any renamings. The renaming must be applied separately, see gpb_names:compute_renamings/2 and gpb_names:apply_renamings/2. See gpb_names:is_renaming_opt/1 for how to filter options. See file/2 for information on options and return values.

read_import/2

read_import(File :: string(), Opts :: opts()) ->
               {ok, string()} | {error, reason()}

Read an import file. This function might be potentially useful for instance in an intercepting import_fetcher fun that just wants to record the accessed imports.

show_args/0

show_args() -> term()

show_version/0

show_version() -> term()

string/2

string(Mod :: module(), Str :: string()) -> comp_ret()

Equivalent to string(Mod, Str, []).

string/3

string(Mod :: module(), Str :: string(), Opts :: opts()) ->
          comp_ret()

Compile a .proto file as string. See file/2 for information on options and return values.

string_list_io/2

string_list_io(Mod :: module(), Str :: string()) ->
                  [io_info_item()]

Equivalent to string_list_io(Mod, Str, []).

string_list_io/3

string_list_io(Mod :: module(), Str :: string(), Opts :: opts()) ->
                  [io_info_item()]

List inputs and file outputs based on proto definitions in a string instead of in a file, similar to string/3. See list_io/2 for further information.


Generated by EDoc