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 orundefined 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.
arg() = term() | named_arg()
arg_template() = [arg()]
bin_ret() =
{ok, module(), code()} | {ok, module(), code(), [warning()]}
boolean_opt(X) = X | {X, boolean()}
Just an option X means {X,true}
code() = binary() | gpb_defs:defs() | [code_item()]
code_item() =
{erl, ErlCode :: binary()} | {nif, NifCcText :: string()}
comp_ret() = mod_ret() | bin_ret() | defs_ret() | error_ret()
defs_ret() =
{ok, gpb_defs:defs()} | {ok, gpb_defs:defs(), [warning()]}
directory() = string()
error_ret() =
error | {error, reason()} | {error, reason(), [warning()]}
fetcher_ret() = from_file | {ok, string()} | {error, term()}
field_path() = [atom() | []]
fn_name() = atom()
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() =
int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 |
fixed64 | sfixed32 | sfixed64 | bool | string
gpb_map_value() = gpb_scalar() | {enum, atom()} | {msg, atom()}
gpb_scalar() =
int32 | int64 | uint32 | uint64 | sint32 | sint64 | fixed32 |
fixed64 | sfixed32 | sfixed64 | bool | float | double |
string | bytes
import_fetcher_fun() = fun((string()) -> fetcher_ret())
json_array_format() = list | {atom(), list}
A list or a list in a tagged tuple.
json_format() = jsx | mochijson2 | jiffy | maps
Convenience shorthand to specify object, key, array and string and null format.
json_key_format() = atom | binary | string
json_object_format() =
eep18 | {proplist} | {atom(), proplist} | map
eep18 means objects on format [{}] | proplist(), such as
for instance for jsx.{proplist} means a proplist() in a tuple.{atom(),proplist} means a proplist() in a tagged tuple,
such as {struct, proplist()} for instance for mochijson2.map means as a mapjson_string_format() = binary | list
mod_fn_argtemplate() = {module(), fn_name(), arg_template()}
mod_ret() = ok | {ok, [warning()]}
msg_name_change() =
name_change() | {prefix, {by_proto, prefix_by_proto()}}
name_change() =
{prefix, string() | atom()} |
{suffix, string() | atom()} |
lowercase | snake_case | dots_to_underscores | base_name
named_arg() = '$1' | '$2' | '$errorf' | '$user_data' | '$op'
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} |
term()
opts() = [opt()]
prefix_by_proto() =
[{ProtoName :: atom(), Prefix :: string() | atom()}]
reason() = term()
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()}
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() = term()
| c/0 | Command line interface for the compiler. |
| c/1 | This function is intended as a command line interface for the compiler. |
| c/2 | |
| file/1 | Equivalent to file(File, []). |
| file/2 | Compile a .proto file to a .erl file and to a .hrl file. |
| format_error/1 | Produce a plain-text error message from a reason returned by
for instance file/2 or proto_defs/2. |
| format_warning/1 | Produce a plain-text error message from a reason returned by
for instance file/2 or proto_defs/2. |
| locate_import/2 | Locate an import target. |
| msg_defs/2 | Deprecated, use proto_defs/2 instead. |
| msg_defs/3 | Deprecated, use proto_defs/2 instead. |
| parse_opts_and_args/1 | |
| proto_defs/2 | Equivalent 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/2 | Read an import file. |
| show_args/0 | |
| show_version/0 | |
| string/2 | Equivalent to string(Mod, Str, []). |
| string/3 |
Compile a .proto file as string. |
c() -> no_return()
Command line interface for the compiler. With no proto file to compile, print a help message and exit.
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
-o-erl and -o_erl are the same option.
-IDir -I Dir-o Dir-o-erl Dir | -o-hrl Dir | -o-nif-cc Dir-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-nif-load_nif FunctionDefinitionFunctionDefinition 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()bytes. See the copy_bytes option
for the function file/2 for more info.-strbin-pldefs#field{} records, to make the generated code
completely free of even compile-time dependencies to gpb.-pkgs-translate_type TMsFsTMsFs 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=TypeType 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:FnMod: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:FnMod:Fn(Value) to unpack the just wire-decoded Value
of type Type, to something of your choice.m=Mod:FnMod: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:FnMod: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:FnMod:Fn(Term, ErrorF) -> _ to verify an unpacked Term.
This exists for backwards compatibility, and its use
is deprecated.-translate_field FMsFs-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=PathPath 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 generallyMsgName.OneofName.FieldName for oneof fieldsMsgName.FieldName.[] for elements of repeated fieldsi=Mod:FnMod:Fn() on decoding to initialize
the field to some valuea=Mod:FnMod:Fn(Elem,S) on decoding
to add an item)f=Mod:FnMod:Fn(S) on decoding
to finalize the field-any_translate MsFsMsFs 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 PrefixPrefix. This can be useful to
when including different sub-projects that have colliding
message names.-modprefix PrefixPrefix. 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 SuffixSuffix.-modsuffix SuffixSuffix.-modname Name-msgtolower-rename What:HowWhat values are available:
pkg_name-pkgs option.msg_namemsg_fqname-pkgs option.group_namegroup_fqnameservice_nameservice_fqnamerpc_namemsg_typenameenum_typenameHow values are available:
prefix=Prefixsuffix=Suffixlower_caseMsgName to msgnamesnake_caseMsgName to msg_namedots_to_underscoresMsg.Sub to Msg_Subbase_nameDomain.Pkg.Msg to Msgproto=Proto:prefix=Prefix[,...].proto suffix, prepend Prefix to the beginning of the name.
This only works for msg_name and msg_fqname.-il-include_lib
instead of -include, which is the default.-type-no_type::Type() annotations in the generated code.
Default is to enable if there are no cyclic dependencies.-descr-maps-msgs-as-maps-mapfields-as-maps-defs-as-mapsmaps option for the function file/2
for more info.-maps_unset_optional omitted | present_undefined-maps_oneof tuples | flat-maps and -maps_unset_optional omitted, of which the latter
is default since 4.0.0.)-maps_key_type atom | binary-msgs-as-maps.hrl file will
be generated.
Without this option, messages will be records.-mapfields-as-mapsmap<_,_> should be maps.
Otherwise, they will be 2-tuples.-defs-as-maps-pldefs option
is specified)-erlc_compile_options Options-compile(...) directive on the generated code.-epb-epb-functions option-defaults-for-omitted-optionals option-modsuffix _pb option-msgtolower option-epb-functionsencode/1, decode/2, encode_MsgName/1
and decode_MsgName/1-defaults-for-omitted-optionalsundefined.-type-defaults-for-omitted-optionalsundefined.-for-version N-bypass-wrappers-json-json-format jsx | mochijson2 | jiffy | mapsmaps is default if the -maps option is specified,
otherwise the jsx format is default.-json-object-format eep18 | tpl | tpl:Tag | mapeep18 means [{}] | proplist(), this is the default.tpl means {proplist()}.tpl:Tag means {Tag, proplist()}.map means map().-json-key-format binary | atom | stringbinary is the default.-json-array-format list | tl:Taglist means list(), this is the default.tl:Tag means {Tag, list()}.-json-string-format binary | listbinary is the default.-json-null Nullnull is the default.-json-always-print-primitive-fields-json-preserve-proto-field-names.proto file, not
as lowerCamelCase.-json-case-insensitive-enum-parsing-no-gen-mergers-nif.-no-gen-introspect-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--help or -h--version or -Vprotoc does.
c(Opts :: opts(), Args :: [ProtoFileName :: string()]) -> no_return()
file(File :: string()) -> comp_ret()
Equivalent to file(File, []).
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.
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:
alwaysneveroptionallyencode_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.
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:
falsetrueautobinary:copy/1 function. (This is the default)
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.
maps option will generate a protobuf encoder/decoder that
uses maps instead of records. This option expands to the following
options:
msgs_as_maps.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_mapsmap<_,_> will be a map
instead of a list of 2-tuples.defs_as_maps#field{} records, unless, of course
defs_as_proplists is specified, in which case they will be
proplists instead.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:
omittedpresent_undefinedundefined.
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.
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_warningsreportreport_errors and
report_warnings.return_errors{error,ErrorList,WarningList} is
returned when there are errors.return_warningsWarningList
is added to the tuples returned on success.returnreturn_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.
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:
Mod:Fn(Term) to pack the Term ($1) to
a value of the suitable for normal gpb encoding.Mod:Fn(Any) to unpack the Any ($1) to
unpack a normal gpb decoded value to a term.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.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.)$user_datauser_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.$opencode, 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}}.
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:
[MsgName] for the message itself on the top-level[MsgName,FieldName] for fields, generally[MsgName,FieldName,[]] for elements of repeated fields[MsgName,OneofFieldName,FieldName] for elements of oneof
fields.
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.
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.
epb_functionsdefaults_for_omitted_optionals{module_name_suffix,"_pb"}{msg_name_to_lower,true}epb_functions option is specified, then for compatibility
with Erlang protobuffs, the following functions will be generated:
encode/1encode_<MsgName>/1decode/2decode_<MsgName>/1
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.
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:
encode_msg_MsgName/1encode_msg_MsgName/2 unless nifdecode_msg_MsgName/1decode_msg_MsgName/2 unless nifuser_data.user_data.
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.
{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.
[{json_object_format, eep18},
{json_key_format, binary},
{json_array_format, list},
{json_string_format, binary},
{json_null, null}][{json_object_format, {struct, proplist}},
{json_key_format, binary},
{json_array_format, list},
{json_string_format, binary},
{json_null, null}][{json_object_format, {proplist}},
{json_key_format, binary},
{json_array_format, list},
{json_string_format, binary},
{json_null, null}][{json_object_format, map},
{json_key_format, binary},
{json_array_format, list},
{json_string_format, binary},
{json_null, null}]{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[{}].{proplist}{atom(), proplist}map{json_key_format,Format} option specifies the format
of json object keys, as follows:
atombinary (default)string{json_array_format,Format} option specifies the format
of json arrays, as follows:
list (default){atom(), list} A list in a tagged tuple, with the possibility
to specify the tag.{json_string_format,Format} option specifies the format
of json arrays, as follows:
listbinary (default)
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.
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.
Produce a plain-text error message from a reason returned by
for instance file/2 or proto_defs/2.
format_warning(X :: warning()) -> iolist()
Produce a plain-text error message from a reason returned by
for instance file/2 or proto_defs/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(Mod :: module(), Defs :: gpb_defs:defs()) -> comp_ret()
Equivalent to msg_defs(Mod, Defs, []).
Deprecated, use proto_defs/2 instead.
msg_defs(Mod, Defs, Opts) -> CompRet
Equivalent to proto_defs(Mod, Defs, Opts).
Deprecated, use proto_defs/2 instead.
parse_opts_and_args(Argv :: [string()]) ->
{ok, {opts(), Args :: [string()]}} |
{error, Reason :: string()}
proto_defs(Mod :: module(), Defs :: gpb_defs:defs()) -> comp_ret()
Equivalent to proto_defs(Mod, Defs, []).
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(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 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() -> term()
show_version() -> term()
string(Mod :: module(), Str :: string()) -> comp_ret()
Equivalent to string(Mod, Str, []).
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.
Generated by EDoc