src/datastar_gleam@mist.erl

-module(datastar_gleam@mist).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datastar_gleam/mist.gleam").
-export([to_mist_event/1, send_event/2]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

-file("src/datastar_gleam/mist.gleam", 55).
-spec data_string(datastar_gleam:datastar_event()) -> binary().
data_string(Ev) ->
    gleam@string:join(erlang:element(5, Ev), <<"\n"/utf8>>).

-file("src/datastar_gleam/mist.gleam", 23).
?DOC(
    " Convert a `DatastarEvent` into a `mist.SSEEvent` for use with\n"
    " `mist.server_sent_events`.\n"
    "\n"
    " ```gleam\n"
    " let ev =\n"
    "   event.new_elements(\"<div>Updated!</div>\")\n"
    "   |> event.patch_elements_to_datastar_event()\n"
    "\n"
    " let mist_ev = datastar_mist.to_mist_event(ev)\n"
    " ```\n"
).
-spec to_mist_event(datastar_gleam:datastar_event()) -> mist:s_s_e_event().
to_mist_event(Ev) ->
    Data_string = gleam_stdlib:identity(data_string(Ev)),
    Sse = mist:event(Data_string),
    Sse@1 = mist:event_name(
        Sse,
        datastar_gleam@consts:event_type_string(erlang:element(2, Ev))
    ),
    Sse@2 = case erlang:element(3, Ev) of
        {some, Id} ->
            mist:event_id(Sse@1, Id);

        none ->
            Sse@1
    end,
    Sse@3 = case erlang:element(4, Ev) of
        1000 ->
            Sse@2;

        N ->
            mist:event_retry(Sse@2, N)
    end,
    Sse@3.

-file("src/datastar_gleam/mist.gleam", 45).
?DOC(
    " Send a `DatastarEvent` over an established `mist.SSEConnection`.\n"
    "\n"
    " ```gleam\n"
    " let patch = event.new_elements(\"<div>Hello!</div>\")\n"
    " let ev = event.patch_elements_to_datastar_event(patch)\n"
    " let _ = datastar_mist.send_event(conn, ev)\n"
    " ```\n"
).
-spec send_event(mist:s_s_e_connection(), datastar_gleam:datastar_event()) -> {ok,
        nil} |
    {error, nil}.
send_event(Conn, Ev) ->
    _pipe = to_mist_event(Ev),
    mist:send_event(Conn, _pipe).