-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(BKTV, BKTW, BKTX), telega@flow@types:flow_instance(), BKUB ) -> {ok, {telega@bot:context(BKTV, BKTW, BKTX), telega@flow@types:flow_action(BKUB), telega@flow@types:flow_instance()}} | {error, BKTW}. 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(BKUG, BKUH, BKUI), telega@flow@types:flow_instance(), binary() ) -> {ok, {telega@bot:context(BKUG, BKUH, BKUI), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKUH}. 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(BKUR, BKUS, BKUT), telega@flow@types:flow_instance(), BKUX ) -> {ok, {telega@bot:context(BKUR, BKUS, BKUT), telega@flow@types:flow_action(BKUX), telega@flow@types:flow_instance()}} | {error, BKUS}. 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(BKVC, BKVD, BKVE), telega@flow@types:flow_instance() ) -> {ok, {telega@bot:context(BKVC, BKVD, BKVE), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKVD}. back(Ctx, Instance) -> {ok, {Ctx, back, Instance}}. -file("src/telega/flow/action.gleam", 49). ?DOC(" Complete the flow\n"). -spec complete( telega@bot:context(BKVN, BKVO, BKVP), telega@flow@types:flow_instance() ) -> {ok, {telega@bot:context(BKVN, BKVO, BKVP), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKVO}. 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(BKVY, BKVZ, BKWA), telega@flow@types:flow_instance() ) -> {ok, {telega@bot:context(BKVY, BKVZ, BKWA), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKVZ}. 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(BKWJ, BKWK, BKWL), telega@flow@types:flow_instance() ) -> {ok, {telega@bot:context(BKWJ, BKWK, BKWL), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKWK}. 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(BKWU, BKWV, BKWW), telega@flow@types:flow_instance() ) -> {ok, {telega@bot:context(BKWU, BKWV, BKWW), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKWV}. 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(BKXF, BKXG, BKXH), telega@flow@types:flow_instance(), integer() ) -> {ok, {telega@bot:context(BKXF, BKXG, BKXH), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKXG}. 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(BKXQ, BKXR, BKXS), telega@flow@types:flow_instance(), integer() ) -> {ok, {telega@bot:context(BKXQ, BKXR, BKXS), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKXR}. 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(BKYB, BKYC, BKYD), telega@flow@types:flow_instance(), gleam@option:option(gleam@dict:dict(binary(), binary())) ) -> {ok, {telega@bot:context(BKYB, BKYC, BKYD), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKYC}. 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(BKYP, BKYQ, BKYR), telega@flow@types:flow_instance(), binary(), gleam@dict:dict(binary(), binary()) ) -> {ok, {telega@bot:context(BKYP, BKYQ, BKYR), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKYQ}. 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(BKZC, BKZD, BKZE), telega@flow@types:flow_instance(), gleam@dict:dict(binary(), binary()) ) -> {ok, {telega@bot:context(BKZC, BKZD, BKZE), telega@flow@types:flow_action(any()), telega@flow@types:flow_instance()}} | {error, BKZD}. 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(BKZP, BKZQ, BKZR), telega@flow@types:flow_instance(), {ok, BKZV} | {error, any()}, fun((BKZV) -> {ok, {telega@bot:context(BKZP, BKZQ, BKZR), telega@flow@types:flow_action(BKZZ), telega@flow@types:flow_instance()}} | {error, BKZQ}) ) -> {ok, {telega@bot:context(BKZP, BKZQ, BKZR), telega@flow@types:flow_action(BKZZ), telega@flow@types:flow_instance()}} | {error, BKZQ}. '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(BLAI, BLAJ, BLAK), telega@flow@types:flow_instance(), {ok, BLAO} | {error, BLAP}, fun((BLAP) -> binary()), fun((BLAO) -> {ok, {telega@bot:context(BLAI, BLAJ, BLAK), telega@flow@types:flow_action(BLAS), telega@flow@types:flow_instance()}} | {error, BLAJ}) ) -> {ok, {telega@bot:context(BLAI, BLAJ, BLAK), telega@flow@types:flow_action(BLAS), telega@flow@types:flow_instance()}} | {error, BLAJ}. 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.