-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>>)).