src/datastar_gleam.erl

-module(datastar_gleam).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datastar_gleam.gleam").
-export([default_retry/0, to_string/1]).
-export_type([datastar_event/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.

-type datastar_event() :: {datastar_event,
        datastar_gleam@consts:event_type(),
        gleam@option:option(binary()),
        integer(),
        list(binary())}.

-file("src/datastar_gleam.gleam", 29).
?DOC(" The default SSE retry duration used by Datastar (1000 ms).\n").
-spec default_retry() -> integer().
default_retry() ->
    1000.

-file("src/datastar_gleam.gleam", 46).
?DOC(
    " Serialize a `DatastarEvent` to the SSE wire format.\n"
    "\n"
    " ```gleam\n"
    " import datastar\n"
    " import datastar/event\n"
    "\n"
    " let ev =\n"
    "   event.new_elements(\"<div>Hello!</div>\")\n"
    "   |> event.patch_elements_to_datastar_event()\n"
    "\n"
    " let text = datastar.to_string(ev)\n"
    " // => \"event: datastar-patch-elements\\ndata: elements <div>Hello!</div>\\n\\n\"\n"
    " ```\n"
).
-spec to_string(datastar_event()) -> binary().
to_string(Ev) ->
    Base = <<"event: "/utf8,
        (datastar_gleam@consts:event_type_string(erlang:element(2, Ev)))/binary>>,
    Base@1 = case erlang:element(3, Ev) of
        {some, I} ->
            <<<<Base/binary, "\nid: "/utf8>>/binary, I/binary>>;

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

        N ->
            <<<<Base@1/binary, "\nretry: "/utf8>>/binary,
                (erlang:integer_to_binary(N))/binary>>
    end,
    Data_lines = gleam@list:map(
        erlang:element(5, Ev),
        fun(Line) -> <<"data: "/utf8, Line/binary>> end
    ),
    Body = gleam@string:join(Data_lines, <<"\n"/utf8>>),
    <<<<<<Base@2/binary, "\n"/utf8>>/binary, Body/binary>>/binary, "\n\n"/utf8>>.