This commit is contained in:
anlicheng 2025-05-06 10:06:16 +08:00
parent 4e73d2a588
commit b0d42ef2c8
3 changed files with 23 additions and 28 deletions

View File

@ -57,7 +57,7 @@
service_name = <<>> :: unicode:chardata() | undefined, % = 2, optional
at = 0 :: integer() | undefined, % = 3, optional, 32 bits
tags = [] :: [{unicode:chardata(), unicode:chardata()}] | undefined, % = 4
fields = [] :: [iodata()] | undefined % = 5, repeated
fields = <<>> :: iodata() | undefined % = 5, optional
}).
-endif.

View File

@ -304,11 +304,15 @@ encode_msg_data(#data{device_uuid = F1, service_name = F2, at = F3, tags = F4, f
true -> e_field_data_tags(TrF4, B3, TrUserData)
end
end,
begin
TrF5 = id(F5, TrUserData),
if TrF5 == [] -> B4;
true -> e_field_data_fields(TrF5, B4, TrUserData)
end
if F5 == undefined -> B4;
true ->
begin
TrF5 = id(F5, TrUserData),
case iolist_size(TrF5) of
0 -> B4;
_ -> e_type_bytes(TrF5, <<B4/binary, 42>>, TrUserData)
end
end
end.
encode_msg_ping(Msg, TrUserData) -> encode_msg_ping(Msg, <<>>, TrUserData).
@ -635,12 +639,6 @@ e_field_data_tags([Elem | Rest], Bin, TrUserData) ->
e_field_data_tags(Rest, Bin3, TrUserData);
e_field_data_tags([], Bin, _TrUserData) -> Bin.
e_field_data_fields([Elem | Rest], Bin, TrUserData) ->
Bin2 = <<Bin/binary, 42>>,
Bin3 = e_type_bytes(id(Elem, TrUserData), Bin2, TrUserData),
e_field_data_fields(Rest, Bin3, TrUserData);
e_field_data_fields([], Bin, _TrUserData) -> Bin.
e_field_ping_ips([Elem | Rest], Bin, TrUserData) ->
Bin2 = <<Bin/binary, 58>>,
Bin3 = e_type_string(id(Elem, TrUserData), Bin2, TrUserData),
@ -1103,14 +1101,14 @@ skip_32_session_reply(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp
skip_64_session_reply(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_session_reply(Rest, Z1, Z2, F, F@_1, TrUserData).
decode_msg_data(Bin, TrUserData) -> dfp_read_field_def_data(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), 'tr_decode_init_default_data.tags'([], TrUserData), id([], TrUserData), TrUserData).
decode_msg_data(Bin, TrUserData) -> dfp_read_field_def_data(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), 'tr_decode_init_default_data.tags'([], TrUserData), id(<<>>, TrUserData), TrUserData).
dfp_read_field_def_data(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_device_uuid(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
dfp_read_field_def_data(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_service_name(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
dfp_read_field_def_data(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_at(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
dfp_read_field_def_data(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_tags(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
dfp_read_field_def_data(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_fields(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
dfp_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, R2, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = lists_reverse(R2, TrUserData)};
dfp_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = F@_5};
dfp_read_field_def_data(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_data(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData).
dg_read_field_def_data(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 32 - 7 -> dg_read_field_def_data(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
@ -1131,7 +1129,7 @@ dg_read_field_def_data(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F
5 -> skip_32_data(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData)
end
end;
dg_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, R2, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = lists_reverse(R2, TrUserData)}.
dg_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = F@_5}.
d_field_data_device_uuid(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_data_device_uuid(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
d_field_data_device_uuid(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) ->
@ -1154,9 +1152,9 @@ d_field_data_tags(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev,
dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, 'tr_decode_repeated_add_elem_data.tags'(NewFValue, Prev, TrUserData), F@_5, TrUserData).
d_field_data_fields(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_data_fields(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
d_field_data_fields(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, Prev, TrUserData) ->
d_field_data_fields(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, cons(NewFValue, Prev, TrUserData), TrUserData).
dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, TrUserData).
skip_varint_data(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
skip_varint_data(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData).
@ -1925,9 +1923,8 @@ merge_msg_data(#data{device_uuid = PFdevice_uuid, service_name = PFservice_name,
NFtags == undefined -> PFtags
end,
fields =
if PFfields /= undefined, NFfields /= undefined -> 'erlang_++'(PFfields, NFfields, TrUserData);
PFfields == undefined -> NFfields;
NFfields == undefined -> PFfields
if NFfields =:= undefined -> PFfields;
true -> NFfields
end}.
-compile({nowarn_unused_function,merge_msg_ping/3}).
@ -2188,10 +2185,8 @@ v_msg_data(#data{device_uuid = F1, service_name = F2, at = F3, tags = F4, fields
true -> v_type_int32(F3, [at | Path], TrUserData)
end,
'v_map<string,string>'(F4, [tags | Path], TrUserData),
if is_list(F5) ->
_ = [v_type_bytes(Elem, [fields | Path], TrUserData) || Elem <- F5],
ok;
true -> mk_type_error({invalid_list_of, bytes}, F5, [fields | Path])
if F5 == undefined -> ok;
true -> v_type_bytes(F5, [fields | Path], TrUserData)
end,
ok;
v_msg_data(X, Path, _TrUserData) -> mk_type_error({expected_msg, data}, X, Path).
@ -2485,7 +2480,7 @@ get_msg_defs() ->
#field{name = service_name, fnum = 2, rnum = 3, type = string, occurrence = optional, opts = []},
#field{name = at, fnum = 3, rnum = 4, type = int32, occurrence = optional, opts = []},
#field{name = tags, fnum = 4, rnum = 5, type = {map, string, string}, occurrence = repeated, opts = []},
#field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = repeated, opts = []}]},
#field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = optional, opts = []}]},
{{msg, ping},
[#field{name = adcode, fnum = 1, rnum = 2, type = string, occurrence = optional, opts = []},
#field{name = boot_time, fnum = 2, rnum = 3, type = uint32, occurrence = optional, opts = []},
@ -2560,7 +2555,7 @@ find_msg_def(data) ->
#field{name = service_name, fnum = 2, rnum = 3, type = string, occurrence = optional, opts = []},
#field{name = at, fnum = 3, rnum = 4, type = int32, occurrence = optional, opts = []},
#field{name = tags, fnum = 4, rnum = 5, type = {map, string, string}, occurrence = repeated, opts = []},
#field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = repeated, opts = []}];
#field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = optional, opts = []}];
find_msg_def(ping) ->
[#field{name = adcode, fnum = 1, rnum = 2, type = string, occurrence = optional, opts = []},
#field{name = boot_time, fnum = 2, rnum = 3, type = uint32, occurrence = optional, opts = []},

View File

@ -37,8 +37,8 @@ message Data {
string service_name = 2;
int32 at = 3;
map<string, string> tags = 4;
//
repeated bytes fields = 5;
// ;
bytes fields = 5;
}
//#{<<"adcode">> => 0,<<"boot_time">> => 18256077,<<"city">> => <<>>,