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