Current section

Files

Jump to
chrobot src chrobot@internal@utils.erl
Raw

src/chrobot@internal@utils.erl

-module(chrobot@internal@utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([add_optional/3, try_call_with_subject/4]).
-spec add_optional(
list({binary(), gleam@json:json()}),
gleam@option:option(OSH),
fun((OSH) -> {binary(), gleam@json:json()})
) -> list({binary(), gleam@json:json()}).
add_optional(Prop_encoders, Value, Callback) ->
case Value of
{some, A} ->
[Callback(A) | Prop_encoders];
none ->
Prop_encoders
end.
-spec try_call_with_subject(
gleam@erlang@process:subject(OSK),
fun((gleam@erlang@process:subject(OSM)) -> OSK),
gleam@erlang@process:subject(OSM),
integer()
) -> {ok, OSM} | {error, gleam@erlang@process:call_error(OSM)}.
try_call_with_subject(Subject, Make_request, Reply_subject, Timeout) ->
Monitor = gleam@erlang@process:monitor_process(
gleam@erlang@process:subject_owner(Subject)
),
gleam@erlang@process:send(Subject, Make_request(Reply_subject)),
Result = begin
_pipe = gleam_erlang_ffi:new_selector(),
_pipe@1 = gleam@erlang@process:selecting(
_pipe,
Reply_subject,
fun(Field@0) -> {ok, Field@0} end
),
_pipe@2 = gleam@erlang@process:selecting_process_down(
_pipe@1,
Monitor,
fun(Down) -> {error, {callee_down, erlang:element(3, Down)}} end
),
gleam_erlang_ffi:select(_pipe@2, Timeout)
end,
gleam_erlang_ffi:demonitor(Monitor),
case Result of
{error, nil} ->
{error, call_timeout};
{ok, Res} ->
Res
end.