Current section

Files

Jump to
telega src telega@flow@action.erl
Raw

src/telega@flow@action.erl

-module(telega@flow@action).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/telega/flow/action.gleam").
-export([next/3, unsafe_next/3, goto/3, back/2, complete/2, cancel/2, wait/2, wait_callback/2, wait_with_timeout/3, wait_callback_with_timeout/3, exit/3, enter_subflow/4, return_from_subflow/3, 'try'/4, try_with_message/5]).
-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(" Pure control functions that construct `FlowAction` values.\n").
-file("src/telega/flow/action.gleam", 14).
?DOC(" Next navigation\n").
-spec next(
telega@bot:context(AJQT, AJQU),
telega@flow@types:flow_instance(),
AJQX
) -> {ok,
{telega@bot:context(AJQT, AJQU),
telega@flow@types:flow_action(AJQX),
telega@flow@types:flow_instance()}} |
{error, AJQU}.
next(Ctx, Instance, Step) ->
{ok, {Ctx, {next, Step}, Instance}}.
-file("src/telega/flow/action.gleam", 23).
?DOC(" Next navigation with string step (for dynamic navigation)\n").
-spec unsafe_next(
telega@bot:context(AJRB, AJRC),
telega@flow@types:flow_instance(),
binary()
) -> {ok,
{telega@bot:context(AJRB, AJRC),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJRC}.
unsafe_next(Ctx, Instance, Step) ->
{ok, {Ctx, {next_string, Step}, Instance}}.
-file("src/telega/flow/action.gleam", 32).
?DOC(" Type-safe goto navigation (clears step data)\n").
-spec goto(
telega@bot:context(AJRJ, AJRK),
telega@flow@types:flow_instance(),
AJRN
) -> {ok,
{telega@bot:context(AJRJ, AJRK),
telega@flow@types:flow_action(AJRN),
telega@flow@types:flow_instance()}} |
{error, AJRK}.
goto(Ctx, Instance, Step) ->
{ok, {Ctx, {go_to, Step}, Instance}}.
-file("src/telega/flow/action.gleam", 41).
?DOC(" Go back to previous step\n").
-spec back(telega@bot:context(AJRR, AJRS), telega@flow@types:flow_instance()) -> {ok,
{telega@bot:context(AJRR, AJRS),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJRS}.
back(Ctx, Instance) ->
{ok, {Ctx, back, Instance}}.
-file("src/telega/flow/action.gleam", 49).
?DOC(" Complete the flow\n").
-spec complete(
telega@bot:context(AJRZ, AJSA),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(AJRZ, AJSA),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJSA}.
complete(Ctx, Instance) ->
{ok,
{Ctx,
{complete, erlang:element(3, erlang:element(6, Instance))},
Instance}}.
-file("src/telega/flow/action.gleam", 57).
?DOC(" Cancel the flow\n").
-spec cancel(telega@bot:context(AJSH, AJSI), telega@flow@types:flow_instance()) -> {ok,
{telega@bot:context(AJSH, AJSI),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJSI}.
cancel(Ctx, Instance) ->
{ok, {Ctx, cancel, Instance}}.
-file("src/telega/flow/action.gleam", 65).
?DOC(" Wait for user input\n").
-spec wait(telega@bot:context(AJSP, AJSQ), telega@flow@types:flow_instance()) -> {ok,
{telega@bot:context(AJSP, AJSQ),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJSQ}.
wait(Ctx, Instance) ->
{ok, {Ctx, wait, Instance}}.
-file("src/telega/flow/action.gleam", 73).
?DOC(" Wait for callback\n").
-spec wait_callback(
telega@bot:context(AJSX, AJSY),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(AJSX, AJSY),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJSY}.
wait_callback(Ctx, Instance) ->
{ok, {Ctx, wait_callback, Instance}}.
-file("src/telega/flow/action.gleam", 81).
?DOC(" Wait for user input with timeout\n").
-spec wait_with_timeout(
telega@bot:context(AJTF, AJTG),
telega@flow@types:flow_instance(),
integer()
) -> {ok,
{telega@bot:context(AJTF, AJTG),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJTG}.
wait_with_timeout(Ctx, Instance, Timeout_ms) ->
{ok, {Ctx, {wait_with_timeout, Timeout_ms}, Instance}}.
-file("src/telega/flow/action.gleam", 90).
?DOC(" Wait for callback with timeout\n").
-spec wait_callback_with_timeout(
telega@bot:context(AJTN, AJTO),
telega@flow@types:flow_instance(),
integer()
) -> {ok,
{telega@bot:context(AJTN, AJTO),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJTO}.
wait_callback_with_timeout(Ctx, Instance, Timeout_ms) ->
{ok, {Ctx, {wait_callback_with_timeout, Timeout_ms}, Instance}}.
-file("src/telega/flow/action.gleam", 99).
?DOC(" Exit with result\n").
-spec exit(
telega@bot:context(AJTV, AJTW),
telega@flow@types:flow_instance(),
gleam@option:option(gleam@dict:dict(binary(), binary()))
) -> {ok,
{telega@bot:context(AJTV, AJTW),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJTW}.
exit(Ctx, Instance, Result) ->
{ok, {Ctx, {exit, Result}, Instance}}.
-file("src/telega/flow/action.gleam", 112).
?DOC(
" Enter a subflow by name\n"
"\n"
" This pushes the current flow state onto the stack and starts the subflow.\n"
" When the subflow completes with `return_from_subflow`, execution returns\n"
" to the parent flow at the step specified in `add_subflow`.\n"
).
-spec enter_subflow(
telega@bot:context(AJUG, AJUH),
telega@flow@types:flow_instance(),
binary(),
gleam@dict:dict(binary(), binary())
) -> {ok,
{telega@bot:context(AJUG, AJUH),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJUH}.
enter_subflow(Ctx, Instance, Subflow_name, Data) ->
{ok, {Ctx, {enter_subflow, Subflow_name, Data}, Instance}}.
-file("src/telega/flow/action.gleam", 125).
?DOC(
" Return from a subflow with result data\n"
"\n"
" This pops the parent flow from the stack and merges the result data\n"
" into the parent's state, then continues at the return step.\n"
).
-spec return_from_subflow(
telega@bot:context(AJUQ, AJUR),
telega@flow@types:flow_instance(),
gleam@dict:dict(binary(), binary())
) -> {ok,
{telega@bot:context(AJUQ, AJUR),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, AJUR}.
return_from_subflow(Ctx, Instance, Result) ->
{ok, {Ctx, {return_from_subflow, Result}, Instance}}.
-file("src/telega/flow/action.gleam", 142).
?DOC(
" Try a result, cancelling the flow on error.\n"
"\n"
" Designed for `use` syntax to flatten nested error handling in flow steps:\n"
"\n"
" ```gleam\n"
" use _ <- action.try(ctx, instance, reply.with_text(ctx, \"Hello!\"))\n"
" use data <- action.try(ctx, instance, fetch_data())\n"
" action.complete(ctx, instance)\n"
" ```\n"
).
-spec 'try'(
telega@bot:context(AJVA, AJVB),
telega@flow@types:flow_instance(),
{ok, AJVE} | {error, any()},
fun((AJVE) -> {ok,
{telega@bot:context(AJVA, AJVB),
telega@flow@types:flow_action(AJVI),
telega@flow@types:flow_instance()}} |
{error, AJVB})
) -> {ok,
{telega@bot:context(AJVA, AJVB),
telega@flow@types:flow_action(AJVI),
telega@flow@types:flow_instance()}} |
{error, AJVB}.
'try'(Ctx, Instance, Result, Continue) ->
case Result of
{ok, Value} ->
Continue(Value);
{error, _} ->
cancel(Ctx, Instance)
end.
-file("src/telega/flow/action.gleam", 166).
?DOC(
" Try a result, sending an error message and cancelling the flow on error.\n"
"\n"
" The `to_message` function converts the error into a user-facing message\n"
" that is sent via `reply.with_text` before cancelling.\n"
"\n"
" ```gleam\n"
" use data <- action.try_with_message(ctx, instance,\n"
" extract_data(instance),\n"
" fn(err) { \"❌ Error: \" <> err },\n"
" )\n"
" action.complete(ctx, instance)\n"
" ```\n"
).
-spec try_with_message(
telega@bot:context(AJVP, AJVQ),
telega@flow@types:flow_instance(),
{ok, AJVT} | {error, AJVU},
fun((AJVU) -> binary()),
fun((AJVT) -> {ok,
{telega@bot:context(AJVP, AJVQ),
telega@flow@types:flow_action(AJVX),
telega@flow@types:flow_instance()}} |
{error, AJVQ})
) -> {ok,
{telega@bot:context(AJVP, AJVQ),
telega@flow@types:flow_action(AJVX),
telega@flow@types:flow_instance()}} |
{error, AJVQ}.
try_with_message(Ctx, Instance, Result, To_message, Continue) ->
case Result of
{ok, Value} ->
Continue(Value);
{error, Err} ->
_ = telega@reply:with_text(Ctx, To_message(Err)),
cancel(Ctx, Instance)
end.