Current section
Files
Jump to
Current section
Files
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(ARTV, ARTW, ARTX),
telega@flow@types:flow_instance(),
ARUB
) -> {ok,
{telega@bot:context(ARTV, ARTW, ARTX),
telega@flow@types:flow_action(ARUB),
telega@flow@types:flow_instance()}} |
{error, ARTW}.
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(ARUG, ARUH, ARUI),
telega@flow@types:flow_instance(),
binary()
) -> {ok,
{telega@bot:context(ARUG, ARUH, ARUI),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARUH}.
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(ARUR, ARUS, ARUT),
telega@flow@types:flow_instance(),
ARUX
) -> {ok,
{telega@bot:context(ARUR, ARUS, ARUT),
telega@flow@types:flow_action(ARUX),
telega@flow@types:flow_instance()}} |
{error, ARUS}.
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(ARVC, ARVD, ARVE),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(ARVC, ARVD, ARVE),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARVD}.
back(Ctx, Instance) ->
{ok, {Ctx, back, Instance}}.
-file("src/telega/flow/action.gleam", 49).
?DOC(" Complete the flow\n").
-spec complete(
telega@bot:context(ARVN, ARVO, ARVP),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(ARVN, ARVO, ARVP),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARVO}.
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(ARVY, ARVZ, ARWA),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(ARVY, ARVZ, ARWA),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARVZ}.
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(ARWJ, ARWK, ARWL),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(ARWJ, ARWK, ARWL),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARWK}.
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(ARWU, ARWV, ARWW),
telega@flow@types:flow_instance()
) -> {ok,
{telega@bot:context(ARWU, ARWV, ARWW),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARWV}.
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(ARXF, ARXG, ARXH),
telega@flow@types:flow_instance(),
integer()
) -> {ok,
{telega@bot:context(ARXF, ARXG, ARXH),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARXG}.
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(ARXQ, ARXR, ARXS),
telega@flow@types:flow_instance(),
integer()
) -> {ok,
{telega@bot:context(ARXQ, ARXR, ARXS),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARXR}.
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(ARYB, ARYC, ARYD),
telega@flow@types:flow_instance(),
gleam@option:option(gleam@dict:dict(binary(), binary()))
) -> {ok,
{telega@bot:context(ARYB, ARYC, ARYD),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARYC}.
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(ARYP, ARYQ, ARYR),
telega@flow@types:flow_instance(),
binary(),
gleam@dict:dict(binary(), binary())
) -> {ok,
{telega@bot:context(ARYP, ARYQ, ARYR),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARYQ}.
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(ARZC, ARZD, ARZE),
telega@flow@types:flow_instance(),
gleam@dict:dict(binary(), binary())
) -> {ok,
{telega@bot:context(ARZC, ARZD, ARZE),
telega@flow@types:flow_action(any()),
telega@flow@types:flow_instance()}} |
{error, ARZD}.
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(ARZP, ARZQ, ARZR),
telega@flow@types:flow_instance(),
{ok, ARZV} | {error, any()},
fun((ARZV) -> {ok,
{telega@bot:context(ARZP, ARZQ, ARZR),
telega@flow@types:flow_action(ARZZ),
telega@flow@types:flow_instance()}} |
{error, ARZQ})
) -> {ok,
{telega@bot:context(ARZP, ARZQ, ARZR),
telega@flow@types:flow_action(ARZZ),
telega@flow@types:flow_instance()}} |
{error, ARZQ}.
'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(ASAI, ASAJ, ASAK),
telega@flow@types:flow_instance(),
{ok, ASAO} | {error, ASAP},
fun((ASAP) -> binary()),
fun((ASAO) -> {ok,
{telega@bot:context(ASAI, ASAJ, ASAK),
telega@flow@types:flow_action(ASAS),
telega@flow@types:flow_instance()}} |
{error, ASAJ})
) -> {ok,
{telega@bot:context(ASAI, ASAJ, ASAK),
telega@flow@types:flow_action(ASAS),
telega@flow@types:flow_instance()}} |
{error, ASAJ}.
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.