THRIFT-5635 Update erlang client for Erlang 23-25
Client: erl
Patch: Sergey Yelin
This closes #2677
Summary of changes:
- Add useful compiler options
- Format sources using erlfmt
- Switch to modern callbacks in thrift_* modules
- Add static analysis (dialyzer), disabled by default
- Add/fix types for API calls
NOTE: Enabling static analysis requires additional tweaks in multiplexer module.
diff --git a/lib/erl/src/thrift_multiplexed_protocol.erl b/lib/erl/src/thrift_multiplexed_protocol.erl
index 5f7b70c..ddc9475 100644
--- a/lib/erl/src/thrift_multiplexed_protocol.erl
+++ b/lib/erl/src/thrift_multiplexed_protocol.erl
@@ -24,60 +24,91 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--include("thrift_protocol_behaviour.hrl").
+-export([
+ new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1
+]).
--export([new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1
- ]).
-
--record(protocol, {module, data}).
+-record(protocol, {
+ module :: module(),
+ data :: term()
+}).
-type protocol() :: #protocol{}.
--record (multiplexed_protocol, {protocol_module_to_decorate::atom(),
- protocol_data_to_decorate::term(),
- service_name::nonempty_string()}).
+-record(multiplexed_protocol, {
+ protocol_module_to_decorate :: atom(),
+ protocol_data_to_decorate :: term(),
+ service_name :: nonempty_string()
+}).
--type state() :: #multiplexed_protocol{}.
-
--spec new(ProtocolToDecorate::protocol(), ServiceName::nonempty_string()) -> {ok, Protocol::protocol()}.
-new(ProtocolToDecorate, ServiceName) when is_record(ProtocolToDecorate, protocol),
- is_list(ServiceName) ->
- State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolToDecorate#protocol.module,
- protocol_data_to_decorate = ProtocolToDecorate#protocol.data,
- service_name = ServiceName},
+-spec new(ProtocolToDecorate :: protocol(), ServiceName :: nonempty_string()) ->
+ {ok, Protocol :: protocol()}.
+new(ProtocolToDecorate, ServiceName) when
+ is_record(ProtocolToDecorate, protocol),
+ is_list(ServiceName)
+->
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolToDecorate#protocol.module,
+ protocol_data_to_decorate = ProtocolToDecorate#protocol.data,
+ service_name = ServiceName
+ },
thrift_protocol:new(?MODULE, State).
-flush_transport(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0}) ->
+flush_transport(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ }
+) ->
{State1, ok} = ProtocolModuleToDecorate:flush_transport(State0),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-close_transport(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0}) ->
+close_transport(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ }
+) ->
{State1, ok} = ProtocolModuleToDecorate:close_transport(State0),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-write(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0,
- service_name = ServiceName},
- Message = #protocol_message_begin{name = Name}) ->
- {State1, ok} = ProtocolModuleToDecorate:write(State0,
- Message#protocol_message_begin{name=ServiceName ++
- ?MULTIPLEXED_SERVICE_SEPARATOR ++
- Name}),
+write(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0,
+ service_name = ServiceName
+ },
+ Message = #protocol_message_begin{name = Name}
+) ->
+ {State1, ok} = ProtocolModuleToDecorate:write(
+ State0,
+ Message#protocol_message_begin{
+ name =
+ ServiceName ++
+ ?MULTIPLEXED_SERVICE_SEPARATOR ++
+ Name
+ }
+ ),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok};
-
-write(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0},
- Message) ->
+write(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ },
+ Message
+) ->
{State1, ok} = ProtocolModuleToDecorate:write(State0, Message),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, ok}.
-read(State = #multiplexed_protocol{protocol_module_to_decorate = ProtocolModuleToDecorate,
- protocol_data_to_decorate = State0},
- Message) ->
+read(
+ State = #multiplexed_protocol{
+ protocol_module_to_decorate = ProtocolModuleToDecorate,
+ protocol_data_to_decorate = State0
+ },
+ Message
+) ->
{State1, Result} = ProtocolModuleToDecorate:read(State0, Message),
{State#multiplexed_protocol{protocol_data_to_decorate = State1}, Result}.