Current section
Files
Jump to
Current section
Files
src/radish@tcp.erl
-module(radish@tcp).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([connect/3, execute/3]).
-spec connect(binary(), integer(), integer()) -> {ok, mug:socket()} |
{error, mug:error()}.
connect(Host, Port, Timeout) ->
mug:connect({connection_options, Host, Port, Timeout}).
-spec mapper(mug:tcp_message()) -> {ok, bitstring()} | {error, mug:error()}.
mapper(Message) ->
case Message of
{packet, _, Packet} ->
{ok, Packet};
{socket_closed, _} ->
{error, closed};
{tcp_error, _, Error} ->
{error, Error}
end.
-spec 'receive'(mug:socket(), integer(), fun(() -> any())) -> {ok, bitstring()} |
{error, mug:error()}.
'receive'(Socket, Timeout, Rest) ->
mug:receive_next_packet_as_message(Socket),
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
mug:selecting_tcp_messages(_pipe, fun mapper/1)
end,
Rest(),
_pipe@1 = Selector,
_pipe@2 = gleam_erlang_ffi:select(_pipe@1, Timeout),
_pipe@3 = gleam@result:replace_error(_pipe@2, timeout),
gleam@result:flatten(_pipe@3).
-spec execute(mug:socket(), bitstring(), integer()) -> {ok, bitstring()} |
{error, mug:error()}.
execute(Socket, Packet, Timeout) ->
'receive'(Socket, Timeout, fun() -> mug:send(Socket, Packet) end).