Current section
Files
Jump to
Current section
Files
src/gluon.erl
-module(gluon).
-compile([no_auto_import, nowarn_unused_vars]).
-export([open/2, send_command/2, get/2, del/2, set/3, ping/1, lpush/3, llen/2, lrange/4, close/1]).
-spec open(binary(), integer()) -> {gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())}.
open(Host, Port) ->
gluon@internal@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) ->
_assert_subject = gluon@internal@gluon_utils:generate_regex(
<<"^([0-9]+\r\n){1}"/utf8>>
),
{ok, Re} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"gluon"/utf8>>,
function => <<"parse_bulk_str_resp"/utf8>>,
line => 25})
end,
Value = gluon@internal@gluon_utils:replace_with_regex(Resp, Re, <<""/utf8>>),
gleam@string:drop_right(Value, 1).
-spec 'receive'(
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())
) -> {ok, binary()} | {error, binary()}.
'receive'(Receiver) ->
gluon@internal@gluon_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(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@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>> ->
{error, <<"Key not found."/utf8>>};
<<"$"/utf8, Resp@1/binary>> ->
{ok, parse_bulk_str_resp(Resp@1)};
<<"*"/utf8, Resp@2/binary>> ->
{ok, parse_bulk_str_resp(Resp@2)};
<<"+"/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(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())},
binary()
) -> {ok, binary()} | {error, binary()}.
get(Socket, Key) ->
send_command(Socket, <<<<"GET '"/utf8, Key/binary>>/binary, "'"/utf8>>).
-spec del(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())},
binary()
) -> {ok, integer()} | {error, binary()}.
del(Socket, Key) ->
gleam@result:'try'(
send_command(Socket, <<<<"DEL '"/utf8, Key/binary>>/binary, "'"/utf8>>),
fun(Response) ->
gleam@result:replace_error(
gleam@int:parse(Response),
<<"Failed to parse response."/utf8>>
)
end
).
-spec set(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@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>>/binary,
"'"/utf8>>
).
-spec ping(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())}
) -> {ok, binary()} | {error, binary()}.
ping(Socket) ->
send_command(Socket, <<"PING"/utf8>>).
-spec lpush(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@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(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@tcp_client:client_message())},
binary()
) -> {ok, integer()} | {error, binary()}.
llen(Socket, Key) ->
gleam@result:'try'(
send_command(Socket, <<<<"LLEN '"/utf8, Key/binary>>/binary, "'"/utf8>>),
fun(Response) ->
gleam@result:replace_error(
gleam@int:parse(Response),
<<"Failed to parse response."/utf8>>
)
end
).
-spec lrange(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
gleam@erlang@process:subject(gluon@internal@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) ->
_assert_subject = gluon@internal@gluon_utils:generate_regex(
<<"(\\$[0-9]+\r\n)+"/utf8>>
),
{ok, Re} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"gluon"/utf8>>,
function => <<"lrange"/utf8>>,
line => 97})
end,
_ = begin
_pipe = gluon@internal@gluon_utils:replace_with_regex(
Response,
Re,
<<""/utf8>>
),
_pipe@1 = gleam@string:split(_pipe, <<"\r\n"/utf8>>),
{ok, _pipe@1}
end
end
).
-spec close(
{gleam@erlang@process:subject(gluon@internal@tcp_client:client_message()),
any()}
) -> {ok, nil} | {error, any()}.
close(Socket) ->
{Sender, _} = Socket,
gleam@erlang@process:send(Sender, close),
{ok, nil}.