Skip to main content

src/aion_client.erl

-module(aion_client).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aion_client.gleam").
-export([connect/1, with_transport/2, start_raw/3, start/4, signal_raw/3, signal/4, query_payload/3, query_raw/4, 'query'/5, cancel/2, list/2, describe/2, latest_run/2, default_list_options/1, workflow_ids/1]).
-export_type([config/0, client/0, workflow_handle/0, transport/0, start_options/0, signal_options/0, query_options/0, cancel_options/0, list_options/0, describe_options/0, start_request/0, start_response/0, signal_request/0, query_request/0, cancel_request/0, list_request/0, describe_request/0, workflow_summary/0, workflow_description/0]).

-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(" Caller-side SDK for aion-server workflow operations.\n").

-type config() :: {config,
        binary(),
        gleam@option:option(binary()),
        binary(),
        boolean()}.

-type client() :: {client, config(), transport()}.

-type workflow_handle() :: {workflow_handle, client(), binary(), binary()}.

-type transport() :: {transport,
        fun((config(), start_request()) -> {ok, start_response()} |
            {error, aion_client@error:error()}),
        fun((config(), signal_request()) -> {ok, nil} |
            {error, aion_client@error:error()}),
        fun((config(), query_request()) -> {ok, aion_client@payload:payload()} |
            {error, aion_client@error:error()}),
        fun((config(), cancel_request()) -> {ok, nil} |
            {error, aion_client@error:error()}),
        fun((config(), list_request()) -> {ok, list(workflow_summary())} |
            {error, aion_client@error:error()}),
        fun((config(), describe_request()) -> {ok, workflow_description()} |
            {error, aion_client@error:error()})}.

-type start_options() :: {start_options,
        binary(),
        binary(),
        binary(),
        gleam@option:option(binary())}.

-type signal_options() :: {signal_options,
        binary(),
        gleam@option:option(binary()),
        binary()}.

-type query_options() :: {query_options,
        binary(),
        gleam@option:option(binary()),
        binary()}.

-type cancel_options() :: {cancel_options,
        binary(),
        gleam@option:option(binary()),
        binary()}.

-type list_options() :: {list_options, gleam@option:option(binary())}.

-type describe_options() :: {describe_options,
        binary(),
        gleam@option:option(binary())}.

-type start_request() :: {start_request,
        start_options(),
        aion_client@payload:payload()}.

-type start_response() :: {start_response, binary(), binary()}.

-type signal_request() :: {signal_request,
        signal_options(),
        aion_client@payload:payload()}.

-type query_request() :: {query_request,
        query_options(),
        aion_client@payload:payload()}.

-type cancel_request() :: {cancel_request, cancel_options()}.

-type list_request() :: {list_request, list_options()}.

-type describe_request() :: {describe_request, describe_options()}.

-type workflow_summary() :: {workflow_summary,
        binary(),
        binary(),
        binary(),
        binary()}.

-type workflow_description() :: {workflow_description,
        binary(),
        binary(),
        binary(),
        binary()}.

-file("src/aion_client.gleam", 256).
-spec unavailable_transport() -> transport().
unavailable_transport() ->
    {transport,
        fun(_, _) -> {error, unavailable} end,
        fun(_, _) -> {error, unavailable} end,
        fun(_, _) -> {error, unavailable} end,
        fun(_, _) -> {error, unavailable} end,
        fun(_, _) -> {error, unavailable} end,
        fun(_, _) -> {error, unavailable} end}.

-file("src/aion_client.gleam", 120).
?DOC(
    " Connect once to an aion-server deployment. The current implementation stores\n"
    " validated connection configuration and reuses it for all operations; concrete\n"
    " transport failures surface as operation Results, preserving branchable errors.\n"
).
-spec connect(config()) -> {ok, client()} | {error, aion_client@error:error()}.
connect(Config) ->
    case (erlang:element(2, Config) =:= <<""/utf8>>) orelse (erlang:element(
        4,
        Config
    )
    =:= <<""/utf8>>) of
        true ->
            {error, invalid_argument};

        false ->
            {ok, {client, Config, unavailable_transport()}}
    end.

-file("src/aion_client.gleam", 129).
?DOC(
    " Test/conformance hook for injecting an HTTP/WebSocket transport while keeping\n"
    " the public SDK semantics identical.\n"
).
-spec with_transport(config(), transport()) -> {ok, client()} |
    {error, aion_client@error:error()}.
with_transport(Config, Transport) ->
    case (erlang:element(2, Config) =:= <<""/utf8>>) orelse (erlang:element(
        4,
        Config
    )
    =:= <<""/utf8>>) of
        true ->
            {error, invalid_argument};

        false ->
            {ok, {client, Config, Transport}}
    end.

-file("src/aion_client.gleam", 148).
-spec start_raw(client(), start_options(), aion_client@payload:payload()) -> {ok,
        workflow_handle()} |
    {error, aion_client@error:error()}.
start_raw(Client, Options, Input) ->
    {client, Config, Transport} = Client,
    case (erlang:element(2, Transport))(Config, {start_request, Options, Input}) of
        {ok, {start_response, Workflow_id, Run_id}} ->
            {ok, {workflow_handle, Client, Workflow_id, Run_id}};

        {error, Error} ->
            {error, Error}
    end.

-file("src/aion_client.gleam", 139).
-spec start(client(), start_options(), FFY, fun((FFY) -> gleam@json:json())) -> {ok,
        workflow_handle()} |
    {error, aion_client@error:error()}.
start(Client, Options, Input, Encoder) ->
    start_raw(Client, Options, aion_client@payload:encode(Input, Encoder)).

-file("src/aion_client.gleam", 175).
-spec signal_raw(client(), signal_options(), aion_client@payload:payload()) -> {ok,
        nil} |
    {error, aion_client@error:error()}.
signal_raw(Client, Options, Input) ->
    {client, Config, Transport} = Client,
    (erlang:element(3, Transport))(Config, {signal_request, Options, Input}).

-file("src/aion_client.gleam", 166).
-spec signal(client(), signal_options(), FGD, fun((FGD) -> gleam@json:json())) -> {ok,
        nil} |
    {error, aion_client@error:error()}.
signal(Client, Options, Input, Encoder) ->
    signal_raw(Client, Options, aion_client@payload:encode(Input, Encoder)).

-file("src/aion_client.gleam", 206).
-spec query_payload(client(), query_options(), aion_client@payload:payload()) -> {ok,
        aion_client@payload:payload()} |
    {error, aion_client@error:error()}.
query_payload(Client, Options, Args) ->
    {client, Config, Transport} = Client,
    (erlang:element(4, Transport))(Config, {query_request, Options, Args}).

-file("src/aion_client.gleam", 194).
-spec query_raw(
    client(),
    query_options(),
    aion_client@payload:payload(),
    gleam@dynamic@decode:decoder(FGN)
) -> {ok, FGN} | {error, aion_client@error:error()}.
query_raw(Client, Options, Args, Decoder) ->
    case query_payload(Client, Options, Args) of
        {ok, Reply} ->
            aion_client@payload:decode(Reply, Decoder);

        {error, Error} ->
            {error, Error}
    end.

-file("src/aion_client.gleam", 184).
-spec 'query'(
    client(),
    query_options(),
    FGI,
    fun((FGI) -> gleam@json:json()),
    gleam@dynamic@decode:decoder(FGJ)
) -> {ok, FGJ} | {error, aion_client@error:error()}.
'query'(Client, Options, Args, Encoder, Decoder) ->
    query_raw(
        Client,
        Options,
        aion_client@payload:encode(Args, Encoder),
        Decoder
    ).

-file("src/aion_client.gleam", 215).
-spec cancel(client(), cancel_options()) -> {ok, nil} |
    {error, aion_client@error:error()}.
cancel(Client, Options) ->
    {client, Config, Transport} = Client,
    (erlang:element(5, Transport))(Config, {cancel_request, Options}).

-file("src/aion_client.gleam", 220).
-spec list(client(), list_options()) -> {ok, list(workflow_summary())} |
    {error, aion_client@error:error()}.
list(Client, Options) ->
    {client, Config, Transport} = Client,
    (erlang:element(6, Transport))(Config, {list_request, Options}).

-file("src/aion_client.gleam", 228).
-spec describe(client(), describe_options()) -> {ok, workflow_description()} |
    {error, aion_client@error:error()}.
describe(Client, Options) ->
    {client, Config, Transport} = Client,
    (erlang:element(7, Transport))(Config, {describe_request, Options}).

-file("src/aion_client.gleam", 236).
-spec latest_run(gleam@option:option(binary()), binary()) -> binary().
latest_run(Run_id, Default_run_id) ->
    case Run_id of
        {some, Run_id@1} ->
            Run_id@1;

        none ->
            Default_run_id
    end.

-file("src/aion_client.gleam", 243).
-spec default_list_options(config()) -> list_options().
default_list_options(Config) ->
    {config, _, _, Namespace, _} = Config,
    {list_options, {some, Namespace}}.

-file("src/aion_client.gleam", 248).
-spec workflow_ids(list(workflow_summary())) -> list(binary()).
workflow_ids(Summaries) ->
    _pipe = Summaries,
    gleam@list:map(
        _pipe,
        fun(Summary) ->
            {workflow_summary, Workflow_id, _, _, _} = Summary,
            Workflow_id
        end
    ).