Current section
Files
Jump to
Current section
Files
src/pevensie@redis.erl
-module(pevensie@redis).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([default_config/0, redis_config_to_radish_start_options/1, new_cache_driver/1]).
-export_type([redis/0, redis_error/0, redis_config/0]).
-opaque redis() :: {redis,
redis_config(),
gleam@option:option(bath:pool(gleam@erlang@process:subject(radish@client:message()), gleam@otp@actor:start_error()))}.
-type redis_error() :: {start_error,
bath:start_error(gleam@otp@actor:start_error())} |
actor_error |
connection_error |
{tcp_error, mug:error()} |
{server_error, binary()} |
{shutdown_error, bath:shutdown_error()} |
{pool_error, bath:apply_error(gleam@otp@actor:start_error())} |
unknown_response_error.
-type redis_config() :: {redis_config,
binary(),
integer(),
integer(),
integer(),
gleam@option:option(binary()),
gleam@option:option(binary())}.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 40).
-spec radish_error_to_redis_error(radish@error:error()) -> redis_error().
radish_error_to_redis_error(Err) ->
case Err of
actor_error ->
actor_error;
connection_error ->
connection_error;
{tcp_error, Err@1} ->
{tcp_error, Err@1};
{server_error, Err@2} ->
{server_error, Err@2};
resp_error ->
unknown_response_error;
not_found ->
erlang:error(#{gleam_error => panic,
message => <<"NotFoundError should be handled"/utf8>>,
module => <<"pevensie/redis"/utf8>>,
function => <<"radish_error_to_redis_error"/utf8>>,
line => 49})
end.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 70).
-spec default_config() -> redis_config().
default_config() ->
{redis_config, <<"localhost"/utf8>>, 6379, 5000, 10, none, none}.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 82).
-spec redis_config_to_radish_start_options(redis_config()) -> list(radish:start_option()).
redis_config_to_radish_start_options(Config) ->
Options = [{timeout, erlang:element(4, Config)}],
Options@1 = case Config of
{redis_config, _, _, _, _, {some, Username}, {some, Password}} ->
[{auth_with_username, Username, Password} | Options];
{redis_config, _, _, _, _, {some, Username@1}, none} ->
[{auth_with_username, Username@1, <<""/utf8>>} | Options];
{redis_config, _, _, _, _, none, {some, Password@1}} ->
[{auth, Password@1} | Options];
_ ->
Options
end,
Options@1.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 134).
-spec connect(redis()) -> {ok, redis()} |
{error, pevensie@drivers:connect_error(redis_error())}.
connect(Driver) ->
case Driver of
{redis, Config, none} ->
_pipe = bath:new(
fun() ->
radish:start(
erlang:element(2, Config),
erlang:element(3, Config),
redis_config_to_radish_start_options(Config)
)
end
),
_pipe@1 = bath:with_size(_pipe, erlang:element(5, Config)),
_pipe@2 = bath:with_shutdown(_pipe@1, fun radish:shutdown/1),
_pipe@3 = bath:start(_pipe@2, 1000),
_pipe@4 = gleam@result:map(
_pipe@3,
fun(Conn) -> {redis, Config, {some, Conn}} end
),
gleam@result:map_error(
_pipe@4,
fun(Err) -> {connect_driver_error, {start_error, Err}} end
);
{redis, _, {some, _}} ->
{error, already_connected}
end.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 156).
-spec disconnect(redis()) -> {ok, redis()} |
{error, pevensie@drivers:disconnect_error(redis_error())}.
disconnect(Driver) ->
case Driver of
{redis, Config, {some, Conn}} ->
gleam@result:'try'(
begin
_pipe = bath:shutdown(
Conn,
false,
erlang:element(4, Config)
),
gleam@result:map_error(
_pipe,
fun(Err) ->
{disconnect_driver_error, {shutdown_error, Err}}
end
)
end,
fun(_) -> {ok, {redis, Config, none}} end
);
{redis, _, none} ->
{error, not_connected}
end.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 173).
-spec create_key(binary(), binary()) -> binary().
create_key(Resource_type, Key) ->
<<<<Resource_type/binary, ":"/utf8>>/binary, Key/binary>>.
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 177).
-spec set(redis(), binary(), binary(), binary(), gleam@option:option(integer())) -> {ok,
nil} |
{error, pevensie@cache:set_error(redis_error())}.
set(Driver, Resource_type, Key, Value, Ttl_seconds) ->
{redis, Config, {some, Conn}} = case Driver of
{redis, _, {some, _}} -> Driver;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"pevensie/redis"/utf8>>,
function => <<"set"/utf8>>,
line => 184})
end,
Key@1 = create_key(Resource_type, Key),
Result = (bath:apply(
Conn,
erlang:element(4, Config),
fun(Conn@1) ->
Set_result = case radish:set(
Conn@1,
Key@1,
Value,
erlang:element(4, Config)
) of
{ok, _} ->
{ok, nil};
{error, Err} ->
{error,
{set_driver_error, radish_error_to_redis_error(Err)}}
end,
gleam@result:'try'(
Set_result,
fun(_) ->
Ttl_result = case Ttl_seconds of
none ->
radish:persist(
Conn@1,
Key@1,
erlang:element(4, Config)
);
{some, Ttl_seconds@1} ->
radish:expire(
Conn@1,
Key@1,
Ttl_seconds@1,
erlang:element(4, Config)
)
end,
case Ttl_result of
{ok, _} ->
{ok, nil};
{error, not_found} ->
{error, {set_driver_error, unknown_response_error}};
{error, Err@1} ->
{error,
{set_driver_error,
radish_error_to_redis_error(Err@1)}}
end
end
)
end
)),
_pipe = Result,
_pipe@1 = gleam@result:map_error(
_pipe,
fun(Err@2) -> {set_driver_error, {pool_error, Err@2}} end
),
gleam@result:flatten(_pipe@1).
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 219).
-spec get(redis(), binary(), binary()) -> {ok, binary()} |
{error, pevensie@cache:get_error(redis_error())}.
get(Driver, Resource_type, Key) ->
{redis, Config, {some, Conn}} = case Driver of
{redis, _, {some, _}} -> Driver;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"pevensie/redis"/utf8>>,
function => <<"get"/utf8>>,
line => 224})
end,
Key@1 = create_key(Resource_type, Key),
Result = (bath:apply(
Conn,
erlang:element(4, Config),
fun(Conn@1) ->
Get_result = radish:get(Conn@1, Key@1, erlang:element(4, Config)),
case Get_result of
{ok, Value} ->
{ok, Value};
{error, not_found} ->
{error, got_too_few_records};
{error, Err} ->
{error,
{get_driver_error, radish_error_to_redis_error(Err)}}
end
end
)),
_pipe = Result,
_pipe@1 = gleam@result:map_error(
_pipe,
fun(Err@1) -> {get_driver_error, {pool_error, Err@1}} end
),
gleam@result:flatten(_pipe@1).
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 243).
-spec delete(redis(), binary(), binary()) -> {ok, nil} |
{error, pevensie@cache:delete_error(redis_error())}.
delete(Driver, Resource_type, Key) ->
{redis, Config, {some, Conn}} = case Driver of
{redis, _, {some, _}} -> Driver;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"pevensie/redis"/utf8>>,
function => <<"delete"/utf8>>,
line => 248})
end,
Key@1 = create_key(Resource_type, Key),
Result = (bath:apply(
Conn,
erlang:element(4, Config),
fun(Conn@1) ->
Delete_result = radish:del(
Conn@1,
[Key@1],
erlang:element(4, Config)
),
case Delete_result of
{ok, _} ->
{ok, nil};
{error, not_found} ->
{ok, nil};
{error, Err} ->
{error,
{delete_driver_error, radish_error_to_redis_error(Err)}}
end
end
)),
_pipe = Result,
_pipe@1 = gleam@result:map_error(
_pipe,
fun(Err@1) -> {delete_driver_error, {pool_error, Err@1}} end
),
gleam@result:flatten(_pipe@1).
-file("/Users/isaac/repos/pevensie_redis/src/pevensie/redis.gleam", 121).
-spec new_cache_driver(redis_config()) -> pevensie@cache:cache_driver(redis(), redis_error()).
new_cache_driver(Config) ->
{cache_driver,
{redis, Config, none},
fun connect/1,
fun disconnect/1,
fun set/5,
fun get/3,
fun delete/3}.