Current section
Files
Jump to
Current section
Files
src/glixir@genserver.erl
-module(glixir@genserver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glixir/genserver.gleam").
-export([start_link/2, start_link_named/3, call_timeout/4, call/3, cast/2, lookup_name/1, call_named/3, cast_named/2, stop/1, pid/1]).
-export_type([gen_server/2, gen_server_error/0]).
-opaque gen_server(EOT, EOU) :: {gen_server, gleam@erlang@process:pid_()} |
{gleam_phantom, EOT, EOU}.
-type gen_server_error() :: {start_error, binary()} |
call_timeout |
{call_error, binary()} |
{cast_error, binary()} |
{not_found, binary()} |
{decode_error, list(gleam@dynamic@decode:decode_error())}.
-file("src/glixir/genserver.gleam", 44).
-spec start_link(binary(), gleam@dynamic:dynamic_()) -> {ok,
gen_server(any(), any())} |
{error, gen_server_error()}.
start_link(Module, Args) ->
Final_module_name = case gleam_stdlib:string_starts_with(
Module,
<<"Elixir."/utf8>>
) of
true ->
Module;
false ->
<<"Elixir."/utf8, Module/binary>>
end,
case glixir_ffi:start_genserver(Final_module_name, Args) of
{ok, Pid} ->
{ok, {gen_server, Pid}};
{error, Reason} ->
{error, {start_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/genserver.gleam", 58).
-spec start_link_named(binary(), binary(), gleam@dynamic:dynamic_()) -> {ok,
gen_server(any(), any())} |
{error, gen_server_error()}.
start_link_named(Module, Name, Args) ->
Final_module_name = case gleam_stdlib:string_starts_with(
Module,
<<"Elixir."/utf8>>
) of
true ->
Module;
false ->
<<"Elixir."/utf8, Module/binary>>
end,
case glixir_ffi:start_genserver_named(Final_module_name, Name, Args) of
{ok, Pid} ->
{ok, {gen_server, Pid}};
{error, Reason} ->
{error, {start_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/genserver.gleam", 82).
-spec call_timeout(
gen_server(any(), EPU),
gleam@dynamic:dynamic_(),
integer(),
gleam@dynamic@decode:decoder(EPU)
) -> {ok, EPU} | {error, gen_server_error()}.
call_timeout(Server, Request, Timeout, Decoder) ->
{gen_server, Pid} = Server,
Response = gen_server:call(Pid, Request, Timeout),
_pipe = gleam@dynamic@decode:run(Response, Decoder),
gleam@result:map_error(_pipe, fun(Field@0) -> {decode_error, Field@0} end).
-file("src/glixir/genserver.gleam", 74).
-spec call(
gen_server(any(), EPN),
gleam@dynamic:dynamic_(),
gleam@dynamic@decode:decoder(EPN)
) -> {ok, EPN} | {error, gen_server_error()}.
call(Server, Request, Decoder) ->
call_timeout(Server, Request, 5000, Decoder).
-file("src/glixir/genserver.gleam", 105).
-spec cast(gen_server(any(), any()), gleam@dynamic:dynamic_()) -> {ok, nil} |
{error, gen_server_error()}.
cast(Server, Request) ->
{gen_server, Pid} = Server,
Result = gen_server:cast(Pid, Request),
case erlang:atom_to_binary(Result) of
<<"ok"/utf8>> ->
{ok, nil};
Other ->
{error, {cast_error, Other}}
end.
-file("src/glixir/genserver.gleam", 124).
-spec lookup_name(gleam@erlang@atom:atom_()) -> {ok, gen_server(any(), any())} |
{error, gen_server_error()}.
lookup_name(Name) ->
Pid_result = erlang:whereis(Name),
case gleam_stdlib:classify_dynamic(Pid_result) of
<<"Pid"/utf8>> ->
{ok, {gen_server, gleam_stdlib:identity(Pid_result)}};
_ ->
{error, {not_found, erlang:atom_to_binary(Name)}}
end.
-file("src/glixir/genserver.gleam", 94).
-spec call_named(
gleam@erlang@atom:atom_(),
gleam@dynamic:dynamic_(),
gleam@dynamic@decode:decoder(EQA)
) -> {ok, EQA} | {error, gen_server_error()}.
call_named(Name, Request, Decoder) ->
case lookup_name(Name) of
{ok, Server} ->
call(Server, Request, Decoder);
{error, E} ->
{error, E}
end.
-file("src/glixir/genserver.gleam", 117).
-spec cast_named(gleam@erlang@atom:atom_(), gleam@dynamic:dynamic_()) -> {ok,
nil} |
{error, gen_server_error()}.
cast_named(Name, Request) ->
case lookup_name(Name) of
{ok, Server} ->
cast(Server, Request);
{error, E} ->
{error, E}
end.
-file("src/glixir/genserver.gleam", 134).
-spec stop(gen_server(any(), any())) -> {ok, nil} | {error, gen_server_error()}.
stop(_) ->
{error,
{cast_error,
<<"Use cast/call with explicit Atom message for stop"/utf8>>}}.
-file("src/glixir/genserver.gleam", 138).
-spec pid(gen_server(any(), any())) -> gleam@erlang@process:pid_().
pid(Server) ->
{gen_server, P} = Server,
P.