Current section

Files

Jump to
gluon src gluon.erl
Raw

src/gluon.erl

-module(gluon).
-compile([no_auto_import, nowarn_unused_vars]).
-export([main/2, send_command/2, get/2, del/2, set/3, ping/1, lpush/3, llen/2, lrange/4, close/1]).
-spec main(binary(), integer()) -> {gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())}.
main(Host, Port) ->
tcp_client:init(Host, Port).
-spec parse_str_resp(binary()) -> binary().
parse_str_resp(Resp) ->
_pipe = gleam@string:drop_left(Resp, 1),
gleam@string:drop_right(_pipe, 1).
-spec parse_bulk_str_resp(binary()) -> binary().
parse_bulk_str_resp(Resp) ->
_pipe = gleam@string:drop_left(Resp, 3),
gleam@string:drop_right(_pipe, 1).
-spec 'receive'(gleam@erlang@process:subject(tcp_client:client_message())) -> {ok,
binary()} |
{error, binary()}.
'receive'(Receiver) ->
utils:attempt(
gleam@erlang@process:'receive'(Receiver, 200),
<<"Failed to receive response."/utf8>>,
fun(Resp) -> case Resp of
{receive_message, Resp@1} ->
_pipe = gleam@bit_string:to_string(Resp@1),
gleam@result:replace_error(
_pipe,
<<"Failed to parse response."/utf8>>
);
_ ->
{error, <<"Unknown response"/utf8>>}
end end
).
-spec send_command(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary()
) -> {ok, binary()} | {error, binary()}.
send_command(Socket, Command) ->
{Sender, Receiver} = Socket,
gleam@erlang@process:send(
Sender,
{send_message,
gleam@bit_builder:from_string(<<Command/binary, "\r\n"/utf8>>)}
),
gleam@result:'try'('receive'(Receiver), fun(Resp) -> case Resp of
<<"$-1"/utf8, _/binary>> ->
{ok, <<""/utf8>>};
<<"$"/utf8, _/binary>> ->
{ok, parse_bulk_str_resp(Resp)};
<<"*"/utf8, _/binary>> ->
{ok, parse_bulk_str_resp(Resp)};
<<"+"/utf8, _/binary>> ->
{ok, parse_str_resp(Resp)};
<<":"/utf8, _/binary>> ->
{ok, parse_str_resp(Resp)};
<<"-"/utf8, _/binary>> ->
{error, parse_str_resp(Resp)};
_ ->
{error, <<"Unknown response: "/utf8, Resp/binary>>}
end end).
-spec get(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary()
) -> {ok, binary()} | {error, binary()}.
get(Socket, Key) ->
send_command(Socket, <<"GET "/utf8, Key/binary>>).
-spec del(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary()
) -> {ok, integer()} | {error, binary()}.
del(Socket, Key) ->
gleam@result:'try'(
send_command(Socket, <<"DEL "/utf8, Key/binary>>),
fun(Response) ->
gleam@result:replace_error(
gleam@int:parse(Response),
<<"Failed to parse response."/utf8>>
)
end
).
-spec set(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary(),
binary()
) -> {ok, binary()} | {error, binary()}.
set(Socket, Key, Value) ->
send_command(
Socket,
<<<<<<"SET "/utf8, Key/binary>>/binary, " "/utf8>>/binary,
Value/binary>>
).
-spec ping(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())}
) -> {ok, binary()} | {error, binary()}.
ping(Socket) ->
send_command(Socket, <<"PING"/utf8>>).
-spec lpush(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary(),
binary()
) -> {ok, integer()} | {error, binary()}.
lpush(Socket, Key, Value) ->
gleam@result:'try'(
send_command(
Socket,
<<<<<<"LPUSH "/utf8, Key/binary>>/binary, " "/utf8>>/binary,
Value/binary>>
),
fun(Response) ->
gleam@result:replace_error(
gleam@int:parse(Response),
<<"Failed to parse response."/utf8>>
)
end
).
-spec llen(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary()
) -> {ok, integer()} | {error, binary()}.
llen(Socket, Key) ->
gleam@result:'try'(
send_command(Socket, <<"LLEN "/utf8, Key/binary>>),
fun(Response) ->
gleam@result:replace_error(
gleam@int:parse(Response),
<<"Failed to parse response."/utf8>>
)
end
).
-spec lrange(
{gleam@erlang@process:subject(tcp_client:client_message()),
gleam@erlang@process:subject(tcp_client:client_message())},
binary(),
integer(),
integer()
) -> {ok, list(binary())} | {error, binary()}.
lrange(Socket, Key, Start, Stop) ->
gleam@result:'try'(
send_command(
Socket,
<<<<<<<<<<"LRANGE "/utf8, Key/binary>>/binary, " "/utf8>>/binary,
(gleam@int:to_string(Start))/binary>>/binary,
" "/utf8>>/binary,
(gleam@int:to_string(Stop))/binary>>
),
fun(Response) ->
gleam@result:'try'(
utils:generate_regex(<<"(\\$[0-9]+\r\n)+"/utf8>>),
fun(Re) ->
Response@1 = utils:replace_with_regex(
Response,
Re,
<<""/utf8>>
),
_pipe = Response@1,
_pipe@1 = gleam@string:split(_pipe, <<"\r\n"/utf8>>),
{ok, _pipe@1}
end
)
end
).
-spec close({gleam@erlang@process:subject(tcp_client:client_message()), any()}) -> {ok,
nil} |
{error, any()}.
close(Socket) ->
{Sender, _} = Socket,
gleam@erlang@process:send(Sender, close),
{ok, nil}.