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_compact_protocol.erl b/lib/erl/src/thrift_compact_protocol.erl
index 0f14221..f852fcb 100644
--- a/lib/erl/src/thrift_compact_protocol.erl
+++ b/lib/erl/src/thrift_compact_protocol.erl
@@ -24,28 +24,32 @@
-include("thrift_constants.hrl").
-include("thrift_protocol.hrl").
--export([new/1, new/2,
- read/2,
- write/2,
- flush_transport/1,
- close_transport/1,
- new_protocol_factory/2
- ]).
+-export([
+ new/1, new/2,
+ read/2,
+ write/2,
+ flush_transport/1,
+ close_transport/1,
+ new_protocol_factory/2
+]).
-define(ID_NONE, 16#10000).
-define(CBOOL_NONE, 0).
-define(CBOOL_TRUE, 1).
-define(CBOOL_FALSE, 2).
--record(t_compact, {transport,
- % state for pending boolean fields
- read_stack=[],
- read_value=?CBOOL_NONE,
- write_stack=[],
- write_id=?ID_NONE
- }).
--type state() :: #t_compact{}.
--include("thrift_protocol_behaviour.hrl").
+-type cbool() :: ?CBOOL_NONE | ?CBOOL_TRUE | ?CBOOL_FALSE.
+
+-record(t_compact, {
+ transport :: term(),
+ % state for pending boolean fields
+ read_stack = [] :: iodata(),
+ read_value = ?CBOOL_NONE :: cbool(),
+ write_stack = [] :: iodata(),
+ write_id = ?ID_NONE :: non_neg_integer()
+}).
+
+-type t_compact() :: #t_compact{}.
-define(PROTOCOL_ID, 16#82).
-define(VERSION_MASK, 16#1f).
@@ -67,19 +71,19 @@
typeid_to_compact(?tType_SET) -> 16#A;
typeid_to_compact(?tType_LIST) -> 16#9.
-compact_to_typeid(16#0) -> ?tType_STOP;
-compact_to_typeid(?CBOOL_FALSE) -> ?tType_BOOL;
-compact_to_typeid(?CBOOL_TRUE) -> ?tType_BOOL;
-compact_to_typeid(16#7) -> ?tType_DOUBLE;
-compact_to_typeid(16#3) -> ?tType_I8;
-compact_to_typeid(16#4) -> ?tType_I16;
-compact_to_typeid(16#5) -> ?tType_I32;
-compact_to_typeid(16#6) -> ?tType_I64;
-compact_to_typeid(16#8) -> ?tType_STRING;
-compact_to_typeid(16#C) -> ?tType_STRUCT;
-compact_to_typeid(16#B) -> ?tType_MAP;
-compact_to_typeid(16#A) -> ?tType_SET;
-compact_to_typeid(16#9) -> ?tType_LIST.
+compact_to_typeid(16#0) -> ?tType_STOP;
+compact_to_typeid(?CBOOL_FALSE) -> ?tType_BOOL;
+compact_to_typeid(?CBOOL_TRUE) -> ?tType_BOOL;
+compact_to_typeid(16#7) -> ?tType_DOUBLE;
+compact_to_typeid(16#3) -> ?tType_I8;
+compact_to_typeid(16#4) -> ?tType_I16;
+compact_to_typeid(16#5) -> ?tType_I32;
+compact_to_typeid(16#6) -> ?tType_I64;
+compact_to_typeid(16#8) -> ?tType_STRING;
+compact_to_typeid(16#C) -> ?tType_STRUCT;
+compact_to_typeid(16#B) -> ?tType_MAP;
+compact_to_typeid(16#A) -> ?tType_SET;
+compact_to_typeid(16#9) -> ?tType_LIST.
bool_to_cbool(Value) when Value -> ?CBOOL_TRUE;
bool_to_cbool(_) -> ?CBOOL_FALSE.
@@ -88,30 +92,31 @@
new(Transport) -> new(Transport, _Options = []).
new(Transport, _Options) ->
- State = #t_compact{transport = Transport},
- thrift_protocol:new(?MODULE, State).
+ State = #t_compact{transport = Transport},
+ thrift_protocol:new(?MODULE, State).
flush_transport(This = #t_compact{transport = Transport}) ->
- {NewTransport, Result} = thrift_transport:flush(Transport),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:flush(Transport),
+ {This#t_compact{transport = NewTransport}, Result}.
close_transport(This = #t_compact{transport = Transport}) ->
- {NewTransport, Result} = thrift_transport:close(Transport),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:close(Transport),
+ {This#t_compact{transport = NewTransport}, Result}.
%%%
%%% instance methods
%%%
-write_field_begin(This0 = #t_compact{write_stack=[LastId|T]}, CompactType, Id) ->
- IdDiff = Id - LastId,
- This1 = This0#t_compact{write_stack=[Id|T]},
- case (IdDiff > 0) and (IdDiff < 16) of
- true -> write(This1, {byte, (IdDiff bsl 4) bor CompactType});
- false ->
- {This2, ok} = write(This1, {byte, CompactType}),
- write(This2, {i16, Id})
- end.
+write_field_begin(This0 = #t_compact{write_stack = [LastId | T]}, CompactType, Id) ->
+ IdDiff = Id - LastId,
+ This1 = This0#t_compact{write_stack = [Id | T]},
+ case (IdDiff > 0) and (IdDiff < 16) of
+ true ->
+ write(This1, {byte, (IdDiff bsl 4) bor CompactType});
+ false ->
+ {This2, ok} = write(This1, {byte, CompactType}),
+ write(This2, {i16, Id})
+ end.
-spec to_zigzag(integer()) -> non_neg_integer().
to_zigzag(Value) -> 16#FFFFFFFFFFFFFFFF band ((Value bsl 1) bxor (Value bsr 63)).
@@ -121,270 +126,270 @@
-spec to_varint(non_neg_integer(), iolist()) -> iolist().
to_varint(Value, Acc) when (Value < 16#80) -> [Acc, Value];
-to_varint(Value, Acc) ->
- to_varint(Value bsr 7, [Acc, ((Value band 16#7F) bor 16#80)]).
+to_varint(Value, Acc) -> to_varint(Value bsr 7, [Acc, ((Value band 16#7F) bor 16#80)]).
--spec read_varint(#t_compact{}, non_neg_integer(), non_neg_integer()) -> non_neg_integer().
+-spec read_varint(t_compact(), non_neg_integer(), non_neg_integer()) ->
+ {t_compact(), {'ok', integer()}}.
read_varint(This0, Acc, Count) ->
- {This1, {ok, Byte}} = read(This0, byte),
- case (Byte band 16#80) of
- 0 -> {This1, {ok, (Byte bsl (7 * Count)) + Acc}};
- _ -> read_varint(This1, ((Byte band 16#7f) bsl (7 * Count)) + Acc, Count + 1)
- end.
+ {This1, {ok, Byte}} = read(This0, byte),
+ case (Byte band 16#80) of
+ 0 -> {This1, {ok, (Byte bsl (7 * Count)) + Acc}};
+ _ -> read_varint(This1, ((Byte band 16#7f) bsl (7 * Count)) + Acc, Count + 1)
+ end.
write(This0, #protocol_message_begin{
- name = Name,
- type = Type,
- seqid = Seqid}) ->
- {This1, ok} = write(This0, {byte, ?PROTOCOL_ID}),
- {This2, ok} = write(This1, {byte, (?VERSION_1 band ?VERSION_MASK) bor (Type bsl ?TYPE_SHIFT_AMOUNT)}),
- {This3, ok} = write(This2, {ui32, Seqid}),
- {This4, ok} = write(This3, {string, Name}),
- {This4, ok};
-
-write(This, message_end) -> {This, ok};
-
+ name = Name,
+ type = Type,
+ seqid = Seqid
+}) ->
+ {This1, ok} = write(This0, {byte, ?PROTOCOL_ID}),
+ {This2, ok} = write(
+ This1, {byte, (?VERSION_1 band ?VERSION_MASK) bor (Type bsl ?TYPE_SHIFT_AMOUNT)}
+ ),
+ {This3, ok} = write(This2, {ui32, Seqid}),
+ {This4, ok} = write(This3, {string, Name}),
+ {This4, ok};
+write(This, message_end) ->
+ {This, ok};
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id})
-when (Type =:= ?tType_BOOL) -> {This0#t_compact{write_id = Id}, ok};
-
+ name = _Name,
+ type = Type,
+ id = Id
+}) when
+ (Type =:= ?tType_BOOL)
+->
+ {This0#t_compact{write_id = Id}, ok};
write(This0, #protocol_field_begin{
- name = _Name,
- type = Type,
- id = Id}) ->
- write_field_begin(This0, typeid_to_compact(Type), Id);
-
-write(This, field_stop) -> write(This, {byte, ?tType_STOP});
-
-write(This, field_end) -> {This, ok};
-
+ name = _Name,
+ type = Type,
+ id = Id
+}) ->
+ write_field_begin(This0, typeid_to_compact(Type), Id);
+write(This, field_stop) ->
+ write(This, {byte, ?tType_STOP});
+write(This, field_end) ->
+ {This, ok};
write(This0, #protocol_map_begin{
- ktype = _Ktype,
- vtype = _Vtype,
- size = Size})
-when Size =:= 0 ->
- write(This0, {byte, 0});
-
+ ktype = _Ktype,
+ vtype = _Vtype,
+ size = Size
+}) when
+ Size =:= 0
+->
+ write(This0, {byte, 0});
write(This0, #protocol_map_begin{
- ktype = Ktype,
- vtype = Vtype,
- size = Size}) ->
- {This1, ok} = write(This0, {ui32, Size}),
- write(This1, {byte, (typeid_to_compact(Ktype) bsl 4) bor typeid_to_compact(Vtype)});
-
-write(This, map_end) -> {This, ok};
-
+ ktype = Ktype,
+ vtype = Vtype,
+ size = Size
+}) ->
+ {This1, ok} = write(This0, {ui32, Size}),
+ write(This1, {byte, (typeid_to_compact(Ktype) bsl 4) bor typeid_to_compact(Vtype)});
+write(This, map_end) ->
+ {This, ok};
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size})
-when Size < 16#f ->
- write(This0, {byte, (Size bsl 4) bor typeid_to_compact(Etype)});
-
+ etype = Etype,
+ size = Size
+}) when
+ Size < 16#f
+->
+ write(This0, {byte, (Size bsl 4) bor typeid_to_compact(Etype)});
write(This0, #protocol_list_begin{
- etype = Etype,
- size = Size}) ->
- {This1, ok} = write(This0, {byte, 16#f0 bor typeid_to_compact(Etype)}),
- write(This1, {ui32, Size});
-
-write(This, list_end) -> {This, ok};
-
+ etype = Etype,
+ size = Size
+}) ->
+ {This1, ok} = write(This0, {byte, 16#f0 bor typeid_to_compact(Etype)}),
+ write(This1, {ui32, Size});
+write(This, list_end) ->
+ {This, ok};
write(This0, #protocol_set_begin{
- etype = Etype,
- size = Size}) ->
- write(This0, #protocol_list_begin{etype = Etype, size = Size});
-
-write(This, set_end) -> {This, ok};
-
+ etype = Etype,
+ size = Size
+}) ->
+ write(This0, #protocol_list_begin{etype = Etype, size = Size});
+write(This, set_end) ->
+ {This, ok};
write(This = #t_compact{write_stack = Stack}, #protocol_struct_begin{}) ->
- {This#t_compact{write_stack = [0|Stack]}, ok};
-write(This = #t_compact{write_stack = [_|T]}, struct_end) ->
- {This#t_compact{write_stack = T}, ok};
-
+ {This#t_compact{write_stack = [0 | Stack]}, ok};
+write(This = #t_compact{write_stack = [_ | T]}, struct_end) ->
+ {This#t_compact{write_stack = T}, ok};
write(This = #t_compact{write_id = ?ID_NONE}, {bool, Value}) ->
- write(This, {byte, bool_to_cbool(Value)});
-
+ write(This, {byte, bool_to_cbool(Value)});
write(This0 = #t_compact{write_id = Id}, {bool, Value}) ->
- {This1, ok} = write_field_begin(This0, bool_to_cbool(Value), Id),
- {This1#t_compact{write_id = ?ID_NONE}, ok};
-
+ {This1, ok} = write_field_begin(This0, bool_to_cbool(Value), Id),
+ {This1#t_compact{write_id = ?ID_NONE}, ok};
write(This, {byte, Value}) when is_integer(Value) ->
- write(This, <<Value:8/big-signed>>);
-
+ write(This, <<Value:8/big-signed>>);
write(This, {i16, Value}) when is_integer(Value) -> write(This, to_varint(to_zigzag(Value), []));
write(This, {ui32, Value}) when is_integer(Value) -> write(This, to_varint(Value, []));
write(This, {i32, Value}) when is_integer(Value) ->
- write(This, to_varint(to_zigzag(Value), []));
+ write(This, to_varint(to_zigzag(Value), []));
write(This, {i64, Value}) when is_integer(Value) -> write(This, to_varint(to_zigzag(Value), []));
-
write(This, {double, Double}) ->
- write(This, <<Double:64/float-signed-little>>);
-
+ write(This, <<Double:64/float-signed-little>>);
write(This0, {string, Str}) when is_list(Str) ->
- % TODO: limit length
- {This1, ok} = write(This0, {ui32, length(Str)}),
- {This2, ok} = write(This1, list_to_binary(Str)),
- {This2, ok};
-
+ % TODO: limit length
+ {This1, ok} = write(This0, {ui32, length(Str)}),
+ {This2, ok} = write(This1, list_to_binary(Str)),
+ {This2, ok};
write(This0, {string, Bin}) when is_binary(Bin) ->
- % TODO: limit length
- {This1, ok} = write(This0, {ui32, size(Bin)}),
- {This2, ok} = write(This1, Bin),
- {This2, ok};
-
+ % TODO: limit length
+ {This1, ok} = write(This0, {ui32, size(Bin)}),
+ {This2, ok} = write(This1, Bin),
+ {This2, ok};
%% Data :: iolist()
write(This = #t_compact{transport = Trans}, Data) ->
- {NewTransport, Result} = thrift_transport:write(Trans, Data),
- {This#t_compact{transport = NewTransport}, Result}.
+ {NewTransport, Result} = thrift_transport:write(Trans, Data),
+ {This#t_compact{transport = NewTransport}, Result}.
%%
%%
read(This0, message_begin) ->
- {This1, {ok, ?PROTOCOL_ID}} = read(This0, ubyte),
- {This2, {ok, VerAndType}} = read(This1, ubyte),
- ?VERSION_1 = VerAndType band ?VERSION_MASK,
- {This3, {ok, SeqId}} = read(This2, ui32),
- {This4, {ok, Name}} = read(This3, string),
- {This4, #protocol_message_begin{
- name = binary_to_list(Name),
- type = (VerAndType bsr ?TYPE_SHIFT_AMOUNT) band ?TYPE_BITS,
- seqid = SeqId}};
-
-read(This, message_end) -> {This, ok};
-
+ {This1, {ok, ?PROTOCOL_ID}} = read(This0, ubyte),
+ {This2, {ok, VerAndType}} = read(This1, ubyte),
+ ?VERSION_1 = VerAndType band ?VERSION_MASK,
+ {This3, {ok, SeqId}} = read(This2, ui32),
+ {This4, {ok, Name}} = read(This3, string),
+ {This4, #protocol_message_begin{
+ name = binary_to_list(Name),
+ type = (VerAndType bsr ?TYPE_SHIFT_AMOUNT) band ?TYPE_BITS,
+ seqid = SeqId
+ }};
+read(This, message_end) ->
+ {This, ok};
read(This = #t_compact{read_stack = Stack}, struct_begin) ->
- {This#t_compact{read_stack = [0|Stack]}, ok};
-read(This = #t_compact{read_stack = [_H|T]}, struct_end) ->
- {This#t_compact{read_stack = T}, ok};
-
-read(This0 = #t_compact{read_stack = [LastId|T]}, field_begin) ->
- {This1, {ok, Byte}} = read(This0, ubyte),
- case Byte band 16#f of
- CompactType = ?tType_STOP ->
- {This1, #protocol_field_begin{type = CompactType}};
- CompactType ->
- {This2, {ok, Id}} = case Byte bsr 4 of
- 0 -> read(This1, i16);
- IdDiff ->
- {This1, {ok, LastId + IdDiff}}
- end,
- case compact_to_typeid(CompactType) of
- ?tType_BOOL ->
- {This2#t_compact{read_stack = [Id|T], read_value = cbool_to_bool(CompactType)},
- #protocol_field_begin{type = ?tType_BOOL, id = Id}};
- Type ->
- {This2#t_compact{read_stack = [Id|T]},
- #protocol_field_begin{type = Type, id = Id}}
- end
- end;
-
-read(This, field_end) -> {This, ok};
-
+ {This#t_compact{read_stack = [0 | Stack]}, ok};
+read(This = #t_compact{read_stack = [_H | T]}, struct_end) ->
+ {This#t_compact{read_stack = T}, ok};
+read(This0 = #t_compact{read_stack = [LastId | T]}, field_begin) ->
+ {This1, {ok, Byte}} = read(This0, ubyte),
+ case Byte band 16#f of
+ CompactType = ?tType_STOP ->
+ {This1, #protocol_field_begin{type = CompactType}};
+ CompactType ->
+ {This2, {ok, Id}} =
+ case Byte bsr 4 of
+ 0 -> read(This1, i16);
+ IdDiff -> {This1, {ok, LastId + IdDiff}}
+ end,
+ case compact_to_typeid(CompactType) of
+ ?tType_BOOL ->
+ {
+ This2#t_compact{
+ read_stack = [Id | T], read_value = CompactType
+ },
+ #protocol_field_begin{type = ?tType_BOOL, id = Id}
+ };
+ Type ->
+ {This2#t_compact{read_stack = [Id | T]}, #protocol_field_begin{
+ type = Type, id = Id
+ }}
+ end
+ end;
+read(This, field_end) ->
+ {This, ok};
read(This0, map_begin) ->
- {This1, {ok, Size}} = read(This0, ui32),
- {This2, {ok, KV}} = case Size of
- 0 -> {This1, {ok, 0}};
- _ -> read(This1, ubyte)
- end,
- {This2, #protocol_map_begin{ktype = compact_to_typeid(KV bsr 4),
- vtype = compact_to_typeid(KV band 16#f),
- size = Size}};
-read(This, map_end) -> {This, ok};
-
+ {This1, {ok, Size}} = read(This0, ui32),
+ {This2, {ok, KV}} =
+ case Size of
+ 0 -> {This1, {ok, 0}};
+ _ -> read(This1, ubyte)
+ end,
+ {This2, #protocol_map_begin{
+ ktype = compact_to_typeid(KV bsr 4),
+ vtype = compact_to_typeid(KV band 16#f),
+ size = Size
+ }};
+read(This, map_end) ->
+ {This, ok};
read(This0, list_begin) ->
- {This1, {ok, SizeAndType}} = read(This0, ubyte),
- {This2, {ok, Size}} = case (SizeAndType bsr 4) band 16#f of
- 16#f -> read(This1, ui32);
- Else -> {This1, {ok, Else}}
- end,
- {This2, #protocol_list_begin{etype = compact_to_typeid(SizeAndType band 16#f),
- size = Size}};
-
-read(This, list_end) -> {This, ok};
-
+ {This1, {ok, SizeAndType}} = read(This0, ubyte),
+ {This2, {ok, Size}} =
+ case (SizeAndType bsr 4) band 16#f of
+ 16#f -> read(This1, ui32);
+ Else -> {This1, {ok, Else}}
+ end,
+ {This2, #protocol_list_begin{
+ etype = compact_to_typeid(SizeAndType band 16#f),
+ size = Size
+ }};
+read(This, list_end) ->
+ {This, ok};
read(This0, set_begin) ->
- {This1, {ok, SizeAndType}} = read(This0, ubyte),
- {This2, {ok, Size}} = case (SizeAndType bsr 4) band 16#f of
- 16#f -> read(This1, ui32);
- Else -> {This1, {ok, Else}}
- end,
- {This2, #protocol_set_begin{etype = compact_to_typeid(SizeAndType band 16#f),
- size = Size}};
-
-read(This, set_end) -> {This, ok};
-
+ {This1, {ok, SizeAndType}} = read(This0, ubyte),
+ {This2, {ok, Size}} =
+ case (SizeAndType bsr 4) band 16#f of
+ 16#f -> read(This1, ui32);
+ Else -> {This1, {ok, Else}}
+ end,
+ {This2, #protocol_set_begin{
+ etype = compact_to_typeid(SizeAndType band 16#f),
+ size = Size
+ }};
+read(This, set_end) ->
+ {This, ok};
read(This0, field_stop) ->
- {This1, {ok, ?tType_STOP}} = read(This0, ubyte),
- {This1, ok};
-
+ {This1, {ok, ?tType_STOP}} = read(This0, ubyte),
+ {This1, ok};
%%
read(This0 = #t_compact{read_value = ?CBOOL_NONE}, bool) ->
- {This1, {ok, Byte}} = read(This0, ubyte),
- {This1, {ok, cbool_to_bool(Byte)}};
-
+ {This1, {ok, Byte}} = read(This0, ubyte),
+ {This1, {ok, cbool_to_bool(Byte)}};
read(This0 = #t_compact{read_value = Bool}, bool) ->
- {This0#t_compact{read_value = ?CBOOL_NONE}, {ok, Bool}};
-
+ {This0#t_compact{read_value = ?CBOOL_NONE}, {ok, cbool_to_bool(Bool)}};
read(This0, ubyte) ->
- {This1, {ok, <<Val:8/integer-unsigned-big, _/binary>>}} = read_data(This0, 1),
- {This1, {ok, Val}};
-
+ {This1, {ok, <<Val:8/integer-unsigned-big, _/binary>>}} = read_data(This0, 1),
+ {This1, {ok, Val}};
read(This0, byte) ->
- {This1, Bytes} = read_data(This0, 1),
- case Bytes of
- {ok, <<Val:8/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
- Else -> {This1, Else}
- end;
-
+ {This1, Bytes} = read_data(This0, 1),
+ case Bytes of
+ {ok, <<Val:8/integer-signed-big, _/binary>>} -> {This1, {ok, Val}};
+ Else -> {This1, Else}
+ end;
read(This0, i16) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
-read(This0, ui32) -> read_varint(This0, 0, 0);
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
+read(This0, ui32) ->
+ read_varint(This0, 0, 0);
read(This0, i32) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
read(This0, i64) ->
- {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
- {This1, {ok, from_zigzag(Zigzag)}};
-
+ {This1, {ok, Zigzag}} = read_varint(This0, 0, 0),
+ {This1, {ok, from_zigzag(Zigzag)}};
read(This0, double) ->
- {This1, Bytes} = read_data(This0, 8),
- case Bytes of
- {ok, <<Val:64/float-signed-little, _/binary>>} -> {This1, {ok, Val}};
- Else -> {This1, Else}
- end;
-
+ {This1, Bytes} = read_data(This0, 8),
+ case Bytes of
+ {ok, <<Val:64/float-signed-little, _/binary>>} -> {This1, {ok, Val}};
+ Else -> {This1, Else}
+ end;
% returns a binary directly, call binary_to_list if necessary
read(This0, string) ->
- {This1, {ok, Sz}} = read(This0, ui32),
- read_data(This1, Sz).
+ {This1, {ok, Sz}} = read(This0, ui32),
+ read_data(This1, Sz).
-spec read_data(#t_compact{}, non_neg_integer()) ->
{#t_compact{}, {ok, binary()} | {error, _Reason}}.
-read_data(This, 0) -> {This, {ok, <<>>}};
+read_data(This, 0) ->
+ {This, {ok, <<>>}};
read_data(This = #t_compact{transport = Trans}, Len) when is_integer(Len) andalso Len > 0 ->
{NewTransport, Result} = thrift_transport:read(Trans, Len),
{This#t_compact{transport = NewTransport}, Result}.
-
%%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% returns a (fun() -> thrift_protocol())
new_protocol_factory(TransportFactory, _Options) ->
- F = fun() ->
- case TransportFactory() of
+ F = fun() ->
+ case TransportFactory() of
{ok, Transport} ->
- thrift_compact_protocol:new(
- Transport,
- []);
+ thrift_compact_protocol:new(
+ Transport,
+ []
+ );
{error, Error} ->
- {error, Error}
- end
- end,
- {ok, F}.
+ {error, Error}
+ end
+ end,
+ {ok, F}.