Current section

Files

Jump to
mug src mug.erl
Raw

src/mug.erl

-module(mug).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/2, timeout/2, connect/1, send_builder/2, send/2, 'receive'/2, receive_exact/3, shutdown/1, receive_next_packet_as_message/1, selecting_tcp_messages/2]).
-export_type([socket/0, do_not_leak/0, error/0, connection_options/0, gen_tcp_option_name/0, mode_value/0, active_value/0, tcp_message/0]).
-type socket() :: any().
-type do_not_leak() :: any().
-type error() :: closed |
timeout |
eaddrinuse |
eaddrnotavail |
eafnosupport |
ealready |
econnaborted |
econnrefused |
econnreset |
edestaddrreq |
ehostdown |
ehostunreach |
einprogress |
eisconn |
emsgsize |
enetdown |
enetunreach |
enopkg |
enoprotoopt |
enotconn |
enotty |
enotsock |
eproto |
eprotonosupport |
eprototype |
esocktnosupport |
etimedout |
ewouldblock |
exbadport |
exbadseq |
nxdomain |
eacces |
eagain |
ebadf |
ebadmsg |
ebusy |
edeadlk |
edeadlock |
edquot |
eexist |
efault |
efbig |
eftype |
eintr |
einval |
eio |
eisdir |
eloop |
emfile |
emlink |
emultihop |
enametoolong |
enfile |
enobufs |
enodev |
enolck |
enolink |
enoent |
enomem |
enospc |
enosr |
enostr |
enosys |
enotblk |
enotdir |
enotsup |
enxio |
eopnotsupp |
eoverflow |
eperm |
epipe |
erange |
erofs |
espipe |
esrch |
estale |
etxtbsy |
exdev.
-type connection_options() :: {connection_options,
binary(),
integer(),
integer()}.
-type gen_tcp_option_name() :: active | mode.
-type mode_value() :: binary.
-type active_value() :: once.
-type tcp_message() :: {packet, socket(), bitstring()} |
{socket_closed, socket()} |
{tcp_error, socket(), error()}.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 117).
-spec new(binary(), integer()) -> connection_options().
new(Host, Port) ->
{connection_options, Host, Port, 1000}.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 123).
-spec timeout(connection_options(), integer()) -> connection_options().
timeout(Options, Timeout) ->
_record = Options,
{connection_options,
erlang:element(2, _record),
erlang:element(3, _record),
Timeout}.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 140).
-spec connect(connection_options()) -> {ok, socket()} | {error, error()}.
connect(Options) ->
Gen_options = [{active, gleam_stdlib:identity(false)},
{mode, gleam_stdlib:identity(binary)}],
Host = unicode:characters_to_list(erlang:element(2, Options)),
gen_tcp:connect(
Host,
erlang:element(3, Options),
Gen_options,
erlang:element(4, Options)
).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 187).
-spec send_builder(socket(), gleam@bytes_tree:bytes_tree()) -> {ok, nil} |
{error, error()}.
send_builder(Socket, Packet) ->
mug_ffi:send(Socket, Packet).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 178).
-spec send(socket(), bitstring()) -> {ok, nil} | {error, error()}.
send(Socket, Packet) ->
mug_ffi:send(Socket, gleam@bytes_tree:from_bit_array(Packet)).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 194).
-spec 'receive'(socket(), integer()) -> {ok, bitstring()} | {error, error()}.
'receive'(Socket, Timeout) ->
gen_tcp:recv(Socket, 0, Timeout).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 211).
-spec receive_exact(socket(), integer(), integer()) -> {ok, bitstring()} |
{error, error()}.
receive_exact(Socket, Size, Timeout) ->
gen_tcp:recv(Socket, Size, Timeout).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 229).
-spec shutdown(socket()) -> {ok, nil} | {error, error()}.
shutdown(Socket) ->
mug_ffi:shutdown(Socket).
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 242).
-spec receive_next_packet_as_message(socket()) -> nil.
receive_next_packet_as_message(Socket) ->
inet:setopts(Socket, [{active, gleam_stdlib:identity(once)}]),
nil.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 281).
-spec unsafe_coerce_packet(fun((tcp_message()) -> KDY)) -> fun((gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_()) -> KDY).
unsafe_coerce_packet(Mapper) ->
fun(Socket, Data) ->
_pipe = {packet, mug_ffi:coerce(Socket), mug_ffi:coerce(Data)},
Mapper(_pipe)
end.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 290).
-spec unsafe_coerce_closed(fun((tcp_message()) -> KDZ)) -> fun((gleam@dynamic:dynamic_()) -> KDZ).
unsafe_coerce_closed(Mapper) ->
fun(Socket) -> _pipe = {socket_closed, mug_ffi:coerce(Socket)},
Mapper(_pipe) end.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 297).
-spec unsafe_coerce_to_tcp_error(fun((tcp_message()) -> KEA)) -> fun((gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_()) -> KEA).
unsafe_coerce_to_tcp_error(Mapper) ->
fun(Socket, Reason) ->
Mapper({tcp_error, mug_ffi:coerce(Socket), mug_ffi:coerce(Reason)})
end.
-file("/Users/louis/src/gleam/mug/src/mug.gleam", 267).
-spec selecting_tcp_messages(
gleam@erlang@process:selector(KDV),
fun((tcp_message()) -> KDV)
) -> gleam@erlang@process:selector(KDV).
selecting_tcp_messages(Selector, Mapper) ->
Tcp = erlang:binary_to_atom(<<"tcp"/utf8>>),
Closed = erlang:binary_to_atom(<<"tcp_closed"/utf8>>),
Error = erlang:binary_to_atom(<<"tcp_error"/utf8>>),
_pipe = Selector,
_pipe@1 = gleam@erlang@process:selecting_record3(
_pipe,
Tcp,
unsafe_coerce_packet(Mapper)
),
_pipe@2 = gleam@erlang@process:selecting_record2(
_pipe@1,
Closed,
unsafe_coerce_closed(Mapper)
),
gleam@erlang@process:selecting_record3(
_pipe@2,
Error,
unsafe_coerce_to_tcp_error(Mapper)
).