src/rally_runtime@codec.erl

-module(rally_runtime@codec).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rally_runtime/codec.gleam").
-export([encode_flags/1, decode_flags/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(
    " SSR flag serialization. Encodes a page's Model as base64 ETF for\n"
    " embedding in HTML (server-side), and decodes it back during client\n"
    " hydration. Delegates the actual ETF encode/decode to libero via wire.\n"
).

-file("src/rally_runtime/codec.gleam", 11).
?DOC(
    " Encode any Gleam value to a base64 ETF string for embedding in HTML.\n"
    " Used server-side during SSR to serialize the page model into flags.\n"
).
-spec encode_flags(any()) -> binary().
encode_flags(Value) ->
    _pipe = Value,
    _pipe@1 = rally_runtime@wire:encode(_pipe),
    gleam_stdlib:base64_encode(_pipe@1, true).

-file("src/rally_runtime/codec.gleam", 19).
?DOC(
    " Decode a base64 ETF string back to a Gleam value.\n"
    " Used client-side during hydration to read the server-rendered model.\n"
).
-spec decode_flags(binary()) -> {ok, any()} | {error, nil}.
decode_flags(Flags) ->
    gleam@result:'try'(case gleam@bit_array:base64_decode(Flags) of
            {ok, Bits} ->
                {ok, Bits};

            _ ->
                {error, nil}
        end, fun(Bits@1) -> case rally_runtime@wire:decode_safe(Bits@1) of
                {ok, Value} ->
                    {ok, Value};

                _ ->
                    {error, nil}
            end end).