erlang自定义二进制协议
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

117 lines
4.9 KiB

-ifndef(gpb_hrl).
-define(gpb_hrl, true).
-type gpb_scalar() ::
int32 | int64 | uint32 | uint64 | sint32 | sint64
| fixed32 | fixed64 | sfixed32 | sfixed64
| bool
| float | double
| string
| bytes.
-type gpb_map_key() :: % "any scalar type except floating point types and bytes"
int32 | int64 | uint32 | uint64 | sint32 | sint64
| fixed32 | fixed64 | sfixed32 | sfixed64
| bool
| string.
%% It is not possible to have maps in maps directly,
%% so this type is any gpb_field_type() except {map,K,V}.
-type gpb_map_value() ::
gpb_scalar()
| {enum,atom()}
| {msg,atom()}.
-type gpb_field_type() :: %% Erlang type Comment
int32 | int64 % integer() variable-length encoded
| uint32 | uint64 % integer() variable-length encoded
| sint32 | sint64 % integer() variable-length zig-zag encoded
| fixed32 | fixed64 % integer() always 4 | 8 bytes on wire
| sfixed32 | sfixed64 % integer() always 4 | 8 bytes on wire
| bool % true | false
| float | double % float()
| string % string() UTF-8 encoded
% | binary() iff option `strings_as_binaries'
| bytes % binary()
| {enum,atom()} % atom() the enum literal is the atom
| {msg,atom()} % record() the message name is record name
% | map() iff option `maps'
| {group,atom()} % record() name is <msg name>_<field name>
% | map() iff option `maps'
| {map,gpb_map_key(),gpb_map_value()}. % [{K,V}] | map()
%% An intermediary type temporarily used internally within gpb during parsing,
%% neither returned from gpb, nor accepted as input go gpb.
-type gpb_internal_intermediary_ref() ::
{ref, term()} |
{msg, list()} |
{group, list()} |
{enum, list()}.
-type gpb_internal_intermediary_map_ref() ::
{map, gpb_map_key(), gpb_map_value() | gpb_internal_intermediary_ref()}.
%% The following two definitions (`gpb_field' and `gpb_rpc') are to
%% avoid clashes with other code, since the `field' and `rpc' are
%% really too general names, they should have been prefixed.
%%
%% Unfortunately, they are already part of the API, so they can't
%% be changed without breaking backwards compatibility.
%% (They appear as parameters or return values for functions in `gpb'
%% in generated code.)
%%
%% In case a clash, it is possible to redefine the name locally.
%% The recommendation is to redefine them with prefix, ie to `gpb_field'
%% and `gpb_rpc', since this is what they will change to in some future.
%%
-ifdef(gpb_field_record_name).
-define(gpb_field, ?gpb_field_record_name).
-else.
-define(gpb_field, field). %% odd definition is due to backwards compatibility
-endif.
-ifdef(gpb_rpc_record_name).
-define(gpb_rpc, ?gpb_rpc_record_name).
-else.
-define(gpb_rpc, rpc). %% odd definition is due to backwards compatibility
-endif.
-record(?gpb_field, % NB: record name is (currently) `field' (not `gpb_field')!
{name :: atom()
| undefined, % temporarily in some phases
fnum :: integer()
| undefined, % temporarily in some phases
rnum :: pos_integer() % field number in the record
| undefined, % temporarily, during parsing
type :: gpb_field_type() |
gpb_internal_intermediary_ref() |
gpb_internal_intermediary_map_ref()
| undefined, % temporarily in some phases
occurrence :: 'required' | 'optional' | 'repeated'
| undefined, % temporarily in some phases
opts = [] :: [term()]
}).
-record(gpb_oneof,
{name :: atom()
| undefined, % temporarily in some phases
rnum :: pos_integer() % field number in the record
| undefined, % temporarily, during parsing
fields :: [#?gpb_field{}] % all fields have the same rnum
| undefined % temporarily in some phases
}).
-record(?gpb_rpc, % NB: record name is (currently) `rpc' (not `gpb_rpc')!
{name :: atom()
| undefined, % temporarily in some phases
input,
output,
input_stream :: boolean()
| undefined, % temporarily in some phases
output_stream :: boolean()
| undefined, % temporarily in some phases
opts :: [term()]
| undefined % temporarily in some phases
}).
-endif.