-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(<>)} ), 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}.