src/lightspeed@agent@typestate.erl

-module(lightspeed@agent@typestate).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/agent/typestate.gleam").
-export([new/1, handshake/1, mount/1, go_live/1, drain/1, terminate/1, id/1, lifecycle/1, lifecycle_to_string/1]).
-export_type([disconnected/0, handshaking/0, mounted/0, live/0, draining/0, terminated/0, lifecycle/0, agent/1]).

-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(" Typestate lifecycle for Lightspeed session agents.\n").

-type disconnected() :: disconnected.

-type handshaking() :: handshaking.

-type mounted() :: mounted.

-type live() :: live.

-type draining() :: draining.

-type terminated() :: terminated.

-type lifecycle() :: disconnected_label |
    handshaking_label |
    mounted_label |
    live_label |
    draining_label |
    terminated_label.

-opaque agent(FGD) :: {agent, binary(), lifecycle()} | {gleam_phantom, FGD}.

-file("src/lightspeed/agent/typestate.gleam", 49).
?DOC(" Create a disconnected agent.\n").
-spec new(binary()) -> agent(disconnected()).
new(Id) ->
    {agent, Id, disconnected_label}.

-file("src/lightspeed/agent/typestate.gleam", 54).
?DOC(" Transition from disconnected to handshaking.\n").
-spec handshake(agent(disconnected())) -> agent(handshaking()).
handshake(Agent) ->
    {agent, erlang:element(2, Agent), handshaking_label}.

-file("src/lightspeed/agent/typestate.gleam", 59).
?DOC(" Transition from handshaking to mounted.\n").
-spec mount(agent(handshaking())) -> agent(mounted()).
mount(Agent) ->
    {agent, erlang:element(2, Agent), mounted_label}.

-file("src/lightspeed/agent/typestate.gleam", 64).
?DOC(" Transition from mounted to live.\n").
-spec go_live(agent(mounted())) -> agent(live()).
go_live(Agent) ->
    {agent, erlang:element(2, Agent), live_label}.

-file("src/lightspeed/agent/typestate.gleam", 69).
?DOC(" Transition from live to draining.\n").
-spec drain(agent(live())) -> agent(draining()).
drain(Agent) ->
    {agent, erlang:element(2, Agent), draining_label}.

-file("src/lightspeed/agent/typestate.gleam", 74).
?DOC(" Transition from draining to terminated.\n").
-spec terminate(agent(draining())) -> agent(terminated()).
terminate(Agent) ->
    {agent, erlang:element(2, Agent), terminated_label}.

-file("src/lightspeed/agent/typestate.gleam", 79).
?DOC(" Return the agent id.\n").
-spec id(agent(any())) -> binary().
id(Agent) ->
    erlang:element(2, Agent).

-file("src/lightspeed/agent/typestate.gleam", 84).
?DOC(" Return the lifecycle label.\n").
-spec lifecycle(agent(any())) -> lifecycle().
lifecycle(Agent) ->
    erlang:element(3, Agent).

-file("src/lightspeed/agent/typestate.gleam", 89).
?DOC(" Convert a lifecycle label to a stable string.\n").
-spec lifecycle_to_string(lifecycle()) -> binary().
lifecycle_to_string(Lifecycle) ->
    case Lifecycle of
        disconnected_label ->
            <<"disconnected"/utf8>>;

        handshaking_label ->
            <<"handshaking"/utf8>>;

        mounted_label ->
            <<"mounted"/utf8>>;

        live_label ->
            <<"live"/utf8>>;

        draining_label ->
            <<"draining"/utf8>>;

        terminated_label ->
            <<"terminated"/utf8>>
    end.