您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

735 行
23 KiB

  1. %% Vendored from hex_core v0.6.8, do not edit manually
  2. %% -*- coding: utf-8 -*-
  3. %% Automatically generated, do not edit
  4. %% Generated by gpb_compile version 4.3.1
  5. -module(r3_hex_pb_names).
  6. -export([encode_msg/2, encode_msg/3]).
  7. -export([decode_msg/2, decode_msg/3]).
  8. -export([merge_msgs/3, merge_msgs/4]).
  9. -export([verify_msg/2, verify_msg/3]).
  10. -export([get_msg_defs/0]).
  11. -export([get_msg_names/0]).
  12. -export([get_group_names/0]).
  13. -export([get_msg_or_group_names/0]).
  14. -export([get_enum_names/0]).
  15. -export([find_msg_def/1, fetch_msg_def/1]).
  16. -export([find_enum_def/1, fetch_enum_def/1]).
  17. -export([enum_symbol_by_value/2, enum_value_by_symbol/2]).
  18. -export([get_service_names/0]).
  19. -export([get_service_def/1]).
  20. -export([get_rpc_names/1]).
  21. -export([find_rpc_def/2, fetch_rpc_def/2]).
  22. -export([get_package_name/0]).
  23. -export([gpb_version_as_string/0, gpb_version_as_list/0]).
  24. %% enumerated types
  25. -export_type([]).
  26. %% message types
  27. -type 'Names'() ::
  28. #{packages => ['Package'()], % = 1
  29. repository => iodata() % = 2
  30. }.
  31. -type 'Package'() ::
  32. #{name => iodata() % = 1
  33. }.
  34. -export_type(['Names'/0, 'Package'/0]).
  35. -spec encode_msg('Names'() | 'Package'(), atom()) -> binary().
  36. encode_msg(Msg, MsgName) when is_atom(MsgName) ->
  37. encode_msg(Msg, MsgName, []).
  38. -spec encode_msg('Names'() | 'Package'(), atom(), list()) -> binary().
  39. encode_msg(Msg, MsgName, Opts) ->
  40. verify_msg(Msg, MsgName, Opts),
  41. TrUserData = proplists:get_value(user_data, Opts),
  42. case MsgName of
  43. 'Names' -> e_msg_Names(id(Msg, TrUserData), TrUserData);
  44. 'Package' ->
  45. e_msg_Package(id(Msg, TrUserData), TrUserData)
  46. end.
  47. e_msg_Names(Msg, TrUserData) ->
  48. e_msg_Names(Msg, <<>>, TrUserData).
  49. e_msg_Names(#{repository := F2} = M, Bin, TrUserData) ->
  50. B1 = case M of
  51. #{packages := F1} ->
  52. TrF1 = id(F1, TrUserData),
  53. if TrF1 == [] -> Bin;
  54. true -> e_field_Names_packages(TrF1, Bin, TrUserData)
  55. end;
  56. _ -> Bin
  57. end,
  58. begin
  59. TrF2 = id(F2, TrUserData),
  60. e_type_string(TrF2, <<B1/binary, 18>>, TrUserData)
  61. end.
  62. e_msg_Package(Msg, TrUserData) ->
  63. e_msg_Package(Msg, <<>>, TrUserData).
  64. e_msg_Package(#{name := F1}, Bin, TrUserData) ->
  65. begin
  66. TrF1 = id(F1, TrUserData),
  67. e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
  68. end.
  69. e_mfield_Names_packages(Msg, Bin, TrUserData) ->
  70. SubBin = e_msg_Package(Msg, <<>>, TrUserData),
  71. Bin2 = e_varint(byte_size(SubBin), Bin),
  72. <<Bin2/binary, SubBin/binary>>.
  73. e_field_Names_packages([Elem | Rest], Bin,
  74. TrUserData) ->
  75. Bin2 = <<Bin/binary, 10>>,
  76. Bin3 = e_mfield_Names_packages(id(Elem, TrUserData),
  77. Bin2, TrUserData),
  78. e_field_Names_packages(Rest, Bin3, TrUserData);
  79. e_field_Names_packages([], Bin, _TrUserData) -> Bin.
  80. -compile({nowarn_unused_function,e_type_sint/3}).
  81. e_type_sint(Value, Bin, _TrUserData) when Value >= 0 ->
  82. e_varint(Value * 2, Bin);
  83. e_type_sint(Value, Bin, _TrUserData) ->
  84. e_varint(Value * -2 - 1, Bin).
  85. -compile({nowarn_unused_function,e_type_int32/3}).
  86. e_type_int32(Value, Bin, _TrUserData)
  87. when 0 =< Value, Value =< 127 ->
  88. <<Bin/binary, Value>>;
  89. e_type_int32(Value, Bin, _TrUserData) ->
  90. <<N:64/unsigned-native>> = <<Value:64/signed-native>>,
  91. e_varint(N, Bin).
  92. -compile({nowarn_unused_function,e_type_int64/3}).
  93. e_type_int64(Value, Bin, _TrUserData)
  94. when 0 =< Value, Value =< 127 ->
  95. <<Bin/binary, Value>>;
  96. e_type_int64(Value, Bin, _TrUserData) ->
  97. <<N:64/unsigned-native>> = <<Value:64/signed-native>>,
  98. e_varint(N, Bin).
  99. -compile({nowarn_unused_function,e_type_bool/3}).
  100. e_type_bool(true, Bin, _TrUserData) ->
  101. <<Bin/binary, 1>>;
  102. e_type_bool(false, Bin, _TrUserData) ->
  103. <<Bin/binary, 0>>;
  104. e_type_bool(1, Bin, _TrUserData) -> <<Bin/binary, 1>>;
  105. e_type_bool(0, Bin, _TrUserData) -> <<Bin/binary, 0>>.
  106. -compile({nowarn_unused_function,e_type_string/3}).
  107. e_type_string(S, Bin, _TrUserData) ->
  108. Utf8 = unicode:characters_to_binary(S),
  109. Bin2 = e_varint(byte_size(Utf8), Bin),
  110. <<Bin2/binary, Utf8/binary>>.
  111. -compile({nowarn_unused_function,e_type_bytes/3}).
  112. e_type_bytes(Bytes, Bin, _TrUserData)
  113. when is_binary(Bytes) ->
  114. Bin2 = e_varint(byte_size(Bytes), Bin),
  115. <<Bin2/binary, Bytes/binary>>;
  116. e_type_bytes(Bytes, Bin, _TrUserData)
  117. when is_list(Bytes) ->
  118. BytesBin = iolist_to_binary(Bytes),
  119. Bin2 = e_varint(byte_size(BytesBin), Bin),
  120. <<Bin2/binary, BytesBin/binary>>.
  121. -compile({nowarn_unused_function,e_type_fixed32/3}).
  122. e_type_fixed32(Value, Bin, _TrUserData) ->
  123. <<Bin/binary, Value:32/little>>.
  124. -compile({nowarn_unused_function,e_type_sfixed32/3}).
  125. e_type_sfixed32(Value, Bin, _TrUserData) ->
  126. <<Bin/binary, Value:32/little-signed>>.
  127. -compile({nowarn_unused_function,e_type_fixed64/3}).
  128. e_type_fixed64(Value, Bin, _TrUserData) ->
  129. <<Bin/binary, Value:64/little>>.
  130. -compile({nowarn_unused_function,e_type_sfixed64/3}).
  131. e_type_sfixed64(Value, Bin, _TrUserData) ->
  132. <<Bin/binary, Value:64/little-signed>>.
  133. -compile({nowarn_unused_function,e_type_float/3}).
  134. e_type_float(V, Bin, _) when is_number(V) ->
  135. <<Bin/binary, V:32/little-float>>;
  136. e_type_float(infinity, Bin, _) ->
  137. <<Bin/binary, 0:16, 128, 127>>;
  138. e_type_float('-infinity', Bin, _) ->
  139. <<Bin/binary, 0:16, 128, 255>>;
  140. e_type_float(nan, Bin, _) ->
  141. <<Bin/binary, 0:16, 192, 127>>.
  142. -compile({nowarn_unused_function,e_type_double/3}).
  143. e_type_double(V, Bin, _) when is_number(V) ->
  144. <<Bin/binary, V:64/little-float>>;
  145. e_type_double(infinity, Bin, _) ->
  146. <<Bin/binary, 0:48, 240, 127>>;
  147. e_type_double('-infinity', Bin, _) ->
  148. <<Bin/binary, 0:48, 240, 255>>;
  149. e_type_double(nan, Bin, _) ->
  150. <<Bin/binary, 0:48, 248, 127>>.
  151. -compile({nowarn_unused_function,e_varint/3}).
  152. e_varint(N, Bin, _TrUserData) -> e_varint(N, Bin).
  153. -compile({nowarn_unused_function,e_varint/2}).
  154. e_varint(N, Bin) when N =< 127 -> <<Bin/binary, N>>;
  155. e_varint(N, Bin) ->
  156. Bin2 = <<Bin/binary, (N band 127 bor 128)>>,
  157. e_varint(N bsr 7, Bin2).
  158. decode_msg(Bin, MsgName) when is_binary(Bin) ->
  159. decode_msg(Bin, MsgName, []).
  160. decode_msg(Bin, MsgName, Opts) when is_binary(Bin) ->
  161. TrUserData = proplists:get_value(user_data, Opts),
  162. decode_msg_1_catch(Bin, MsgName, TrUserData).
  163. -ifdef('OTP_RELEASE').
  164. decode_msg_1_catch(Bin, MsgName, TrUserData) ->
  165. try decode_msg_2_doit(MsgName, Bin, TrUserData)
  166. catch Class:Reason:StackTrace -> error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}})
  167. end.
  168. -else.
  169. -ifdef('GPB_PATTERN_STACK').
  170. decode_msg_1_catch(Bin, MsgName, TrUserData) ->
  171. try decode_msg_2_doit(MsgName, Bin, TrUserData)
  172. catch Class:Reason:StackTrace -> error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}})
  173. end.
  174. -else.
  175. decode_msg_1_catch(Bin, MsgName, TrUserData) ->
  176. try decode_msg_2_doit(MsgName, Bin, TrUserData)
  177. catch Class:Reason ->
  178. StackTrace = erlang:get_stacktrace(),
  179. error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}})
  180. end.
  181. -endif.
  182. -endif.
  183. decode_msg_2_doit('Names', Bin, TrUserData) ->
  184. id(d_msg_Names(Bin, TrUserData), TrUserData);
  185. decode_msg_2_doit('Package', Bin, TrUserData) ->
  186. id(d_msg_Package(Bin, TrUserData), TrUserData).
  187. d_msg_Names(Bin, TrUserData) ->
  188. dfp_read_field_def_Names(Bin, 0, 0, id([], TrUserData),
  189. id('$undef', TrUserData), TrUserData).
  190. dfp_read_field_def_Names(<<10, Rest/binary>>, Z1, Z2,
  191. F@_1, F@_2, TrUserData) ->
  192. d_field_Names_packages(Rest, Z1, Z2, F@_1, F@_2,
  193. TrUserData);
  194. dfp_read_field_def_Names(<<18, Rest/binary>>, Z1, Z2,
  195. F@_1, F@_2, TrUserData) ->
  196. d_field_Names_repository(Rest, Z1, Z2, F@_1, F@_2,
  197. TrUserData);
  198. dfp_read_field_def_Names(<<>>, 0, 0, R1, F@_2,
  199. TrUserData) ->
  200. S1 = #{repository => F@_2},
  201. if R1 == '$undef' -> S1;
  202. true -> S1#{packages => lists_reverse(R1, TrUserData)}
  203. end;
  204. dfp_read_field_def_Names(Other, Z1, Z2, F@_1, F@_2,
  205. TrUserData) ->
  206. dg_read_field_def_Names(Other, Z1, Z2, F@_1, F@_2,
  207. TrUserData).
  208. dg_read_field_def_Names(<<1:1, X:7, Rest/binary>>, N,
  209. Acc, F@_1, F@_2, TrUserData)
  210. when N < 32 - 7 ->
  211. dg_read_field_def_Names(Rest, N + 7, X bsl N + Acc,
  212. F@_1, F@_2, TrUserData);
  213. dg_read_field_def_Names(<<0:1, X:7, Rest/binary>>, N,
  214. Acc, F@_1, F@_2, TrUserData) ->
  215. Key = X bsl N + Acc,
  216. case Key of
  217. 10 ->
  218. d_field_Names_packages(Rest, 0, 0, F@_1, F@_2,
  219. TrUserData);
  220. 18 ->
  221. d_field_Names_repository(Rest, 0, 0, F@_1, F@_2,
  222. TrUserData);
  223. _ ->
  224. case Key band 7 of
  225. 0 ->
  226. skip_varint_Names(Rest, 0, 0, F@_1, F@_2, TrUserData);
  227. 1 -> skip_64_Names(Rest, 0, 0, F@_1, F@_2, TrUserData);
  228. 2 ->
  229. skip_length_delimited_Names(Rest, 0, 0, F@_1, F@_2,
  230. TrUserData);
  231. 3 ->
  232. skip_group_Names(Rest, Key bsr 3, 0, F@_1, F@_2,
  233. TrUserData);
  234. 5 -> skip_32_Names(Rest, 0, 0, F@_1, F@_2, TrUserData)
  235. end
  236. end;
  237. dg_read_field_def_Names(<<>>, 0, 0, R1, F@_2,
  238. TrUserData) ->
  239. S1 = #{repository => F@_2},
  240. if R1 == '$undef' -> S1;
  241. true -> S1#{packages => lists_reverse(R1, TrUserData)}
  242. end.
  243. d_field_Names_packages(<<1:1, X:7, Rest/binary>>, N,
  244. Acc, F@_1, F@_2, TrUserData)
  245. when N < 57 ->
  246. d_field_Names_packages(Rest, N + 7, X bsl N + Acc, F@_1,
  247. F@_2, TrUserData);
  248. d_field_Names_packages(<<0:1, X:7, Rest/binary>>, N,
  249. Acc, Prev, F@_2, TrUserData) ->
  250. {NewFValue, RestF} = begin
  251. Len = X bsl N + Acc,
  252. <<Bs:Len/binary, Rest2/binary>> = Rest,
  253. {id(d_msg_Package(Bs, TrUserData), TrUserData),
  254. Rest2}
  255. end,
  256. dfp_read_field_def_Names(RestF, 0, 0,
  257. cons(NewFValue, Prev, TrUserData), F@_2,
  258. TrUserData).
  259. d_field_Names_repository(<<1:1, X:7, Rest/binary>>, N,
  260. Acc, F@_1, F@_2, TrUserData)
  261. when N < 57 ->
  262. d_field_Names_repository(Rest, N + 7, X bsl N + Acc,
  263. F@_1, F@_2, TrUserData);
  264. d_field_Names_repository(<<0:1, X:7, Rest/binary>>, N,
  265. Acc, F@_1, _, TrUserData) ->
  266. {NewFValue, RestF} = begin
  267. Len = X bsl N + Acc,
  268. <<Bytes:Len/binary, Rest2/binary>> = Rest,
  269. {id(binary:copy(Bytes), TrUserData), Rest2}
  270. end,
  271. dfp_read_field_def_Names(RestF, 0, 0, F@_1, NewFValue,
  272. TrUserData).
  273. skip_varint_Names(<<1:1, _:7, Rest/binary>>, Z1, Z2,
  274. F@_1, F@_2, TrUserData) ->
  275. skip_varint_Names(Rest, Z1, Z2, F@_1, F@_2, TrUserData);
  276. skip_varint_Names(<<0:1, _:7, Rest/binary>>, Z1, Z2,
  277. F@_1, F@_2, TrUserData) ->
  278. dfp_read_field_def_Names(Rest, Z1, Z2, F@_1, F@_2,
  279. TrUserData).
  280. skip_length_delimited_Names(<<1:1, X:7, Rest/binary>>,
  281. N, Acc, F@_1, F@_2, TrUserData)
  282. when N < 57 ->
  283. skip_length_delimited_Names(Rest, N + 7, X bsl N + Acc,
  284. F@_1, F@_2, TrUserData);
  285. skip_length_delimited_Names(<<0:1, X:7, Rest/binary>>,
  286. N, Acc, F@_1, F@_2, TrUserData) ->
  287. Length = X bsl N + Acc,
  288. <<_:Length/binary, Rest2/binary>> = Rest,
  289. dfp_read_field_def_Names(Rest2, 0, 0, F@_1, F@_2,
  290. TrUserData).
  291. skip_group_Names(Bin, FNum, Z2, F@_1, F@_2,
  292. TrUserData) ->
  293. {_, Rest} = read_group(Bin, FNum),
  294. dfp_read_field_def_Names(Rest, 0, Z2, F@_1, F@_2,
  295. TrUserData).
  296. skip_32_Names(<<_:32, Rest/binary>>, Z1, Z2, F@_1, F@_2,
  297. TrUserData) ->
  298. dfp_read_field_def_Names(Rest, Z1, Z2, F@_1, F@_2,
  299. TrUserData).
  300. skip_64_Names(<<_:64, Rest/binary>>, Z1, Z2, F@_1, F@_2,
  301. TrUserData) ->
  302. dfp_read_field_def_Names(Rest, Z1, Z2, F@_1, F@_2,
  303. TrUserData).
  304. d_msg_Package(Bin, TrUserData) ->
  305. dfp_read_field_def_Package(Bin, 0, 0,
  306. id('$undef', TrUserData), TrUserData).
  307. dfp_read_field_def_Package(<<10, Rest/binary>>, Z1, Z2,
  308. F@_1, TrUserData) ->
  309. d_field_Package_name(Rest, Z1, Z2, F@_1, TrUserData);
  310. dfp_read_field_def_Package(<<>>, 0, 0, F@_1, _) ->
  311. #{name => F@_1};
  312. dfp_read_field_def_Package(Other, Z1, Z2, F@_1,
  313. TrUserData) ->
  314. dg_read_field_def_Package(Other, Z1, Z2, F@_1,
  315. TrUserData).
  316. dg_read_field_def_Package(<<1:1, X:7, Rest/binary>>, N,
  317. Acc, F@_1, TrUserData)
  318. when N < 32 - 7 ->
  319. dg_read_field_def_Package(Rest, N + 7, X bsl N + Acc,
  320. F@_1, TrUserData);
  321. dg_read_field_def_Package(<<0:1, X:7, Rest/binary>>, N,
  322. Acc, F@_1, TrUserData) ->
  323. Key = X bsl N + Acc,
  324. case Key of
  325. 10 ->
  326. d_field_Package_name(Rest, 0, 0, F@_1, TrUserData);
  327. _ ->
  328. case Key band 7 of
  329. 0 -> skip_varint_Package(Rest, 0, 0, F@_1, TrUserData);
  330. 1 -> skip_64_Package(Rest, 0, 0, F@_1, TrUserData);
  331. 2 ->
  332. skip_length_delimited_Package(Rest, 0, 0, F@_1,
  333. TrUserData);
  334. 3 ->
  335. skip_group_Package(Rest, Key bsr 3, 0, F@_1,
  336. TrUserData);
  337. 5 -> skip_32_Package(Rest, 0, 0, F@_1, TrUserData)
  338. end
  339. end;
  340. dg_read_field_def_Package(<<>>, 0, 0, F@_1, _) ->
  341. #{name => F@_1}.
  342. d_field_Package_name(<<1:1, X:7, Rest/binary>>, N, Acc,
  343. F@_1, TrUserData)
  344. when N < 57 ->
  345. d_field_Package_name(Rest, N + 7, X bsl N + Acc, F@_1,
  346. TrUserData);
  347. d_field_Package_name(<<0:1, X:7, Rest/binary>>, N, Acc,
  348. _, TrUserData) ->
  349. {NewFValue, RestF} = begin
  350. Len = X bsl N + Acc,
  351. <<Bytes:Len/binary, Rest2/binary>> = Rest,
  352. {id(binary:copy(Bytes), TrUserData), Rest2}
  353. end,
  354. dfp_read_field_def_Package(RestF, 0, 0, NewFValue,
  355. TrUserData).
  356. skip_varint_Package(<<1:1, _:7, Rest/binary>>, Z1, Z2,
  357. F@_1, TrUserData) ->
  358. skip_varint_Package(Rest, Z1, Z2, F@_1, TrUserData);
  359. skip_varint_Package(<<0:1, _:7, Rest/binary>>, Z1, Z2,
  360. F@_1, TrUserData) ->
  361. dfp_read_field_def_Package(Rest, Z1, Z2, F@_1,
  362. TrUserData).
  363. skip_length_delimited_Package(<<1:1, X:7, Rest/binary>>,
  364. N, Acc, F@_1, TrUserData)
  365. when N < 57 ->
  366. skip_length_delimited_Package(Rest, N + 7,
  367. X bsl N + Acc, F@_1, TrUserData);
  368. skip_length_delimited_Package(<<0:1, X:7, Rest/binary>>,
  369. N, Acc, F@_1, TrUserData) ->
  370. Length = X bsl N + Acc,
  371. <<_:Length/binary, Rest2/binary>> = Rest,
  372. dfp_read_field_def_Package(Rest2, 0, 0, F@_1,
  373. TrUserData).
  374. skip_group_Package(Bin, FNum, Z2, F@_1, TrUserData) ->
  375. {_, Rest} = read_group(Bin, FNum),
  376. dfp_read_field_def_Package(Rest, 0, Z2, F@_1,
  377. TrUserData).
  378. skip_32_Package(<<_:32, Rest/binary>>, Z1, Z2, F@_1,
  379. TrUserData) ->
  380. dfp_read_field_def_Package(Rest, Z1, Z2, F@_1,
  381. TrUserData).
  382. skip_64_Package(<<_:64, Rest/binary>>, Z1, Z2, F@_1,
  383. TrUserData) ->
  384. dfp_read_field_def_Package(Rest, Z1, Z2, F@_1,
  385. TrUserData).
  386. read_group(Bin, FieldNum) ->
  387. {NumBytes, EndTagLen} = read_gr_b(Bin, 0, 0, 0, 0, FieldNum),
  388. <<Group:NumBytes/binary, _:EndTagLen/binary, Rest/binary>> = Bin,
  389. {Group, Rest}.
  390. %% Like skipping over fields, but record the total length,
  391. %% Each field is <(FieldNum bsl 3) bor FieldType> ++ <FieldValue>
  392. %% Record the length because varints may be non-optimally encoded.
  393. %%
  394. %% Groups can be nested, but assume the same FieldNum cannot be nested
  395. %% because group field numbers are shared with the rest of the fields
  396. %% numbers. Thus we can search just for an group-end with the same
  397. %% field number.
  398. %%
  399. %% (The only time the same group field number could occur would
  400. %% be in a nested sub message, but then it would be inside a
  401. %% length-delimited entry, which we skip-read by length.)
  402. read_gr_b(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen, FieldNum)
  403. when N < (32-7) ->
  404. read_gr_b(Tl, N+7, X bsl N + Acc, NumBytes, TagLen+1, FieldNum);
  405. read_gr_b(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen,
  406. FieldNum) ->
  407. Key = X bsl N + Acc,
  408. TagLen1 = TagLen + 1,
  409. case {Key bsr 3, Key band 7} of
  410. {FieldNum, 4} -> % 4 = group_end
  411. {NumBytes, TagLen1};
  412. {_, 0} -> % 0 = varint
  413. read_gr_vi(Tl, 0, NumBytes + TagLen1, FieldNum);
  414. {_, 1} -> % 1 = bits64
  415. <<_:64, Tl2/binary>> = Tl,
  416. read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 8, 0, FieldNum);
  417. {_, 2} -> % 2 = length_delimited
  418. read_gr_ld(Tl, 0, 0, NumBytes + TagLen1, FieldNum);
  419. {_, 3} -> % 3 = group_start
  420. read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum);
  421. {_, 4} -> % 4 = group_end
  422. read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum);
  423. {_, 5} -> % 5 = bits32
  424. <<_:32, Tl2/binary>> = Tl,
  425. read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 4, 0, FieldNum)
  426. end.
  427. read_gr_vi(<<1:1, _:7, Tl/binary>>, N, NumBytes, FieldNum)
  428. when N < (64-7) ->
  429. read_gr_vi(Tl, N+7, NumBytes+1, FieldNum);
  430. read_gr_vi(<<0:1, _:7, Tl/binary>>, _, NumBytes, FieldNum) ->
  431. read_gr_b(Tl, 0, 0, NumBytes+1, 0, FieldNum).
  432. read_gr_ld(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum)
  433. when N < (64-7) ->
  434. read_gr_ld(Tl, N+7, X bsl N + Acc, NumBytes+1, FieldNum);
  435. read_gr_ld(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum) ->
  436. Len = X bsl N + Acc,
  437. NumBytes1 = NumBytes + 1,
  438. <<_:Len/binary, Tl2/binary>> = Tl,
  439. read_gr_b(Tl2, 0, 0, NumBytes1 + Len, 0, FieldNum).
  440. merge_msgs(Prev, New, MsgName) when is_atom(MsgName) ->
  441. merge_msgs(Prev, New, MsgName, []).
  442. merge_msgs(Prev, New, MsgName, Opts) ->
  443. TrUserData = proplists:get_value(user_data, Opts),
  444. case MsgName of
  445. 'Names' -> merge_msg_Names(Prev, New, TrUserData);
  446. 'Package' -> merge_msg_Package(Prev, New, TrUserData)
  447. end.
  448. -compile({nowarn_unused_function,merge_msg_Names/3}).
  449. merge_msg_Names(#{} = PMsg,
  450. #{repository := NFrepository} = NMsg, TrUserData) ->
  451. S1 = #{repository => NFrepository},
  452. case {PMsg, NMsg} of
  453. {#{packages := PFpackages},
  454. #{packages := NFpackages}} ->
  455. S1#{packages =>
  456. 'erlang_++'(PFpackages, NFpackages, TrUserData)};
  457. {_, #{packages := NFpackages}} ->
  458. S1#{packages => NFpackages};
  459. {#{packages := PFpackages}, _} ->
  460. S1#{packages => PFpackages};
  461. {_, _} -> S1
  462. end.
  463. -compile({nowarn_unused_function,merge_msg_Package/3}).
  464. merge_msg_Package(#{}, #{name := NFname}, _) ->
  465. #{name => NFname}.
  466. verify_msg(Msg, MsgName) when is_atom(MsgName) ->
  467. verify_msg(Msg, MsgName, []).
  468. verify_msg(Msg, MsgName, Opts) ->
  469. TrUserData = proplists:get_value(user_data, Opts),
  470. case MsgName of
  471. 'Names' -> v_msg_Names(Msg, [MsgName], TrUserData);
  472. 'Package' -> v_msg_Package(Msg, [MsgName], TrUserData);
  473. _ -> mk_type_error(not_a_known_message, Msg, [])
  474. end.
  475. -compile({nowarn_unused_function,v_msg_Names/3}).
  476. v_msg_Names(#{repository := F2} = M, Path,
  477. TrUserData) ->
  478. case M of
  479. #{packages := F1} ->
  480. if is_list(F1) ->
  481. _ = [v_msg_Package(Elem, [packages | Path], TrUserData)
  482. || Elem <- F1],
  483. ok;
  484. true ->
  485. mk_type_error({invalid_list_of, {msg, 'Package'}}, F1,
  486. [packages | Path])
  487. end;
  488. _ -> ok
  489. end,
  490. v_type_string(F2, [repository | Path], TrUserData),
  491. lists:foreach(fun (packages) -> ok;
  492. (repository) -> ok;
  493. (OtherKey) ->
  494. mk_type_error({extraneous_key, OtherKey}, M, Path)
  495. end,
  496. maps:keys(M)),
  497. ok;
  498. v_msg_Names(M, Path, _TrUserData) when is_map(M) ->
  499. mk_type_error({missing_fields,
  500. [repository] -- maps:keys(M), 'Names'},
  501. M, Path);
  502. v_msg_Names(X, Path, _TrUserData) ->
  503. mk_type_error({expected_msg, 'Names'}, X, Path).
  504. -compile({nowarn_unused_function,v_msg_Package/3}).
  505. v_msg_Package(#{name := F1} = M, Path, TrUserData) ->
  506. v_type_string(F1, [name | Path], TrUserData),
  507. lists:foreach(fun (name) -> ok;
  508. (OtherKey) ->
  509. mk_type_error({extraneous_key, OtherKey}, M, Path)
  510. end,
  511. maps:keys(M)),
  512. ok;
  513. v_msg_Package(M, Path, _TrUserData) when is_map(M) ->
  514. mk_type_error({missing_fields, [name] -- maps:keys(M),
  515. 'Package'},
  516. M, Path);
  517. v_msg_Package(X, Path, _TrUserData) ->
  518. mk_type_error({expected_msg, 'Package'}, X, Path).
  519. -compile({nowarn_unused_function,v_type_string/3}).
  520. v_type_string(S, Path, _TrUserData)
  521. when is_list(S); is_binary(S) ->
  522. try unicode:characters_to_binary(S) of
  523. B when is_binary(B) -> ok;
  524. {error, _, _} ->
  525. mk_type_error(bad_unicode_string, S, Path)
  526. catch
  527. error:badarg ->
  528. mk_type_error(bad_unicode_string, S, Path)
  529. end;
  530. v_type_string(X, Path, _TrUserData) ->
  531. mk_type_error(bad_unicode_string, X, Path).
  532. -compile({nowarn_unused_function,mk_type_error/3}).
  533. -spec mk_type_error(_, _, list()) -> no_return().
  534. mk_type_error(Error, ValueSeen, Path) ->
  535. Path2 = prettify_path(Path),
  536. erlang:error({gpb_type_error,
  537. {Error, [{value, ValueSeen}, {path, Path2}]}}).
  538. -compile({nowarn_unused_function,prettify_path/1}).
  539. prettify_path([]) -> top_level;
  540. prettify_path(PathR) ->
  541. list_to_atom(string:join(lists:map(fun atom_to_list/1,
  542. lists:reverse(PathR)),
  543. ".")).
  544. -compile({nowarn_unused_function,id/2}).
  545. -compile({inline,id/2}).
  546. id(X, _TrUserData) -> X.
  547. -compile({nowarn_unused_function,v_ok/3}).
  548. -compile({inline,v_ok/3}).
  549. v_ok(_Value, _Path, _TrUserData) -> ok.
  550. -compile({nowarn_unused_function,m_overwrite/3}).
  551. -compile({inline,m_overwrite/3}).
  552. m_overwrite(_Prev, New, _TrUserData) -> New.
  553. -compile({nowarn_unused_function,cons/3}).
  554. -compile({inline,cons/3}).
  555. cons(Elem, Acc, _TrUserData) -> [Elem | Acc].
  556. -compile({nowarn_unused_function,lists_reverse/2}).
  557. -compile({inline,lists_reverse/2}).
  558. 'lists_reverse'(L, _TrUserData) -> lists:reverse(L).
  559. -compile({nowarn_unused_function,'erlang_++'/3}).
  560. -compile({inline,'erlang_++'/3}).
  561. 'erlang_++'(A, B, _TrUserData) -> A ++ B.
  562. get_msg_defs() ->
  563. [{{msg, 'Names'},
  564. [#{name => packages, fnum => 1, rnum => 2,
  565. type => {msg, 'Package'}, occurrence => repeated,
  566. opts => []},
  567. #{name => repository, fnum => 2, rnum => 3,
  568. type => string, occurrence => required, opts => []}]},
  569. {{msg, 'Package'},
  570. [#{name => name, fnum => 1, rnum => 2, type => string,
  571. occurrence => required, opts => []}]}].
  572. get_msg_names() -> ['Names', 'Package'].
  573. get_group_names() -> [].
  574. get_msg_or_group_names() -> ['Names', 'Package'].
  575. get_enum_names() -> [].
  576. fetch_msg_def(MsgName) ->
  577. case find_msg_def(MsgName) of
  578. Fs when is_list(Fs) -> Fs;
  579. error -> erlang:error({no_such_msg, MsgName})
  580. end.
  581. -spec fetch_enum_def(_) -> no_return().
  582. fetch_enum_def(EnumName) ->
  583. erlang:error({no_such_enum, EnumName}).
  584. find_msg_def('Names') ->
  585. [#{name => packages, fnum => 1, rnum => 2,
  586. type => {msg, 'Package'}, occurrence => repeated,
  587. opts => []},
  588. #{name => repository, fnum => 2, rnum => 3,
  589. type => string, occurrence => required, opts => []}];
  590. find_msg_def('Package') ->
  591. [#{name => name, fnum => 1, rnum => 2, type => string,
  592. occurrence => required, opts => []}];
  593. find_msg_def(_) -> error.
  594. find_enum_def(_) -> error.
  595. -spec enum_symbol_by_value(_, _) -> no_return().
  596. enum_symbol_by_value(E, V) ->
  597. erlang:error({no_enum_defs, E, V}).
  598. -spec enum_value_by_symbol(_, _) -> no_return().
  599. enum_value_by_symbol(E, V) ->
  600. erlang:error({no_enum_defs, E, V}).
  601. get_service_names() -> [].
  602. get_service_def(_) -> error.
  603. get_rpc_names(_) -> error.
  604. find_rpc_def(_, _) -> error.
  605. -spec fetch_rpc_def(_, _) -> no_return().
  606. fetch_rpc_def(ServiceName, RpcName) ->
  607. erlang:error({no_such_rpc, ServiceName, RpcName}).
  608. get_package_name() -> undefined.
  609. gpb_version_as_string() ->
  610. "4.3.1".
  611. gpb_version_as_list() ->
  612. [4,3,1].