Packages

ClamAV client implementation in pure Gleam

Current section

Files

Jump to
clamav_client src common@tcp.erl
Raw

src/common@tcp.erl

-module(common@tcp).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([connect/2, send_bytes/4, receive_bytes/3]).
-file("/home/runner/work/gleam-clamav/gleam-clamav/src/common/tcp.gleam", 6).
-spec connect(
client_options:clam_av_client_options(),
fun((mug:socket()) -> {ok, GME} | {error, mug:error()})
) -> {ok, GME} | {error, mug:error()}.
connect(Options, Callback) ->
Socket = begin
_pipe = mug:new(erlang:element(2, Options), erlang:element(3, Options)),
_pipe@1 = mug:timeout(_pipe, erlang:element(4, Options)),
mug:connect(_pipe@1)
end,
case Socket of
{ok, Socket@1} ->
Callback(Socket@1);
{error, Error} ->
(erlang:element(2, erlang:element(6, Options)))(
<<"Failed to connect to ClamAV server: "/utf8,
(begin
_pipe@2 = Error,
gleam@string:inspect(_pipe@2)
end)/binary>>
),
{error, Error}
end.
-file("/home/runner/work/gleam-clamav/gleam-clamav/src/common/tcp.gleam", 26).
-spec send_bytes(
mug:socket(),
bitstring(),
client_options:clam_av_client_options(),
fun(() -> {ok, GMK} | {error, mug:error()})
) -> {ok, GMK} | {error, mug:error()}.
send_bytes(Socket, Bits, Options, Callback) ->
case mug:send(Socket, Bits) of
{ok, _} ->
Callback();
{error, Error} ->
(erlang:element(2, erlang:element(6, Options)))(
<<"Failed to send byte packet: "/utf8,
(begin
_pipe = Error,
gleam@string:inspect(_pipe)
end)/binary>>
),
{error, Error}
end.
-file("/home/runner/work/gleam-clamav/gleam-clamav/src/common/tcp.gleam", 43).
-spec receive_bytes(
mug:socket(),
client_options:clam_av_client_options(),
fun((bitstring()) -> {ok, GMP} | {error, mug:error()})
) -> {ok, GMP} | {error, mug:error()}.
receive_bytes(Socket, Options, Callback) ->
case mug:'receive'(Socket, erlang:element(5, Options)) of
{ok, Bits} ->
Byte_size = erlang:byte_size(Bits),
case begin
_pipe = Bits,
gleam_stdlib:bit_array_slice(_pipe, 0, Byte_size - 1)
end of
{ok, Sliced_bits} ->
_pipe@1 = Sliced_bits,
Callback(_pipe@1);
{error, nil} ->
{error, einval}
end;
{error, Error} ->
(erlang:element(2, erlang:element(6, Options)))(
<<"Failed to receive byte packet: "/utf8,
(begin
_pipe@2 = Error,
gleam@string:inspect(_pipe@2)
end)/binary>>
),
{error, Error}
end.