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