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]).
-define(FILEPATH, "src/glixir/genserver.gleam").
-export([start_link/2, start_link_named/3, call_timeout/3, call/2, cast/2, pid/1, lookup_name/1, call_named/2, cast_named/2, stop/1]).
-export_type([gen_server/0, gen_server_error/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Type-safe GenServer interop for Gleam\n"
" \n"
" This module provides a safe interface to Elixir GenServers from Gleam.\n"
).
-opaque gen_server() :: {gen_server, gleam@erlang@process:pid_()}.
-type gen_server_error() :: {start_error, binary()} |
call_timeout |
{call_error, binary()} |
{cast_error, binary()} |
{not_found, binary()}.
-file("src/glixir/genserver.gleam", 51).
?DOC(" Start a GenServer using Module.start_link/1\n").
-spec start_link(binary(), any()) -> {ok, gen_server()} |
{error, gen_server_error()}.
start_link(Module, Args) ->
Module_atom = erlang:binary_to_atom(<<"Elixir."/utf8, Module/binary>>),
case gen_server:start_link(Module_atom, Args, []) of
{ok, Pid} ->
{ok, {gen_server, Pid}};
{error, Reason} ->
{error, {start_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/genserver.gleam", 61).
?DOC(" Start a GenServer with a registered name\n").
-spec start_link_named(binary(), binary(), any()) -> {ok, gen_server()} |
{error, gen_server_error()}.
start_link_named(Module, Name, Args) ->
Module_atom = erlang:binary_to_atom(<<"Elixir."/utf8, Module/binary>>),
Name_atom = erlang:binary_to_atom(Name),
Options = [gleam_stdlib:identity(
{erlang:binary_to_atom(<<"name"/utf8>>), Name_atom}
)],
case gen_server:start_link(Module_atom, Args, Options) of
{ok, Pid} ->
{ok, {gen_server, Pid}};
{error, Reason} ->
{error, {start_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/genserver.gleam", 82).
?DOC(" Send a synchronous call with custom timeout\n").
-spec call_timeout(gen_server(), any(), integer()) -> {ok, any()} |
{error, gen_server_error()}.
call_timeout(Server, Request, Timeout) ->
{gen_server, Pid} = Server,
Response = gen_server:call(Pid, Request, Timeout),
{ok, gleam_stdlib:identity(Response)}.
-file("src/glixir/genserver.gleam", 77).
?DOC(" Send a synchronous call to the GenServer (5s timeout)\n").
-spec call(gen_server(), any()) -> {ok, any()} | {error, gen_server_error()}.
call(Server, Request) ->
call_timeout(Server, Request, 5000).
-file("src/glixir/genserver.gleam", 104).
?DOC(" Send an asynchronous cast to the GenServer\n").
-spec cast(gen_server(), any()) -> {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", 123).
?DOC(" Get the PID of a GenServer\n").
-spec pid(gen_server()) -> gleam@erlang@process:pid_().
pid(Server) ->
{gen_server, P} = Server,
P.
-file("src/glixir/genserver.gleam", 129).
?DOC(" Look up a GenServer by registered name\n").
-spec lookup_name(binary()) -> {ok, gen_server()} | {error, gen_server_error()}.
lookup_name(Name) ->
Name_atom = erlang:binary_to_atom(Name),
Pid_result = erlang:whereis(Name_atom),
case gleam_stdlib:classify_dynamic(Pid_result) of
<<"Pid"/utf8>> ->
{ok, {gen_server, gleam_stdlib:identity(Pid_result)}};
<<"Atom"/utf8>> ->
{error, {not_found, Name}};
_ ->
{error, {not_found, Name}}
end.
-file("src/glixir/genserver.gleam", 96).
?DOC(" Call a named GenServer\n").
-spec call_named(binary(), any()) -> {ok, any()} | {error, gen_server_error()}.
call_named(Name, Request) ->
case lookup_name(Name) of
{ok, Server} ->
call(Server, Request);
{error, E} ->
{error, E}
end.
-file("src/glixir/genserver.gleam", 115).
?DOC(" Cast to a named GenServer\n").
-spec cast_named(binary(), any()) -> {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", 142).
?DOC(" Stop a GenServer gracefully\n").
-spec stop(gen_server()) -> {ok, nil} | {error, gen_server_error()}.
stop(Server) ->
cast(Server, erlang:binary_to_atom(<<"stop"/utf8>>)).