Skip to main content

src/aion_client@payload.erl

-module(aion_client@payload).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aion_client/payload.gleam").
-export([encode/2, decode/2]).
-export_type([payload/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(" Typed JSON encoder/decoder helpers and raw Payload escape hatch.\n").

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

-file("src/aion_client/payload.gleam", 18).
?DOC(" Encode a typed value as a JSON Payload.\n").
-spec encode(FES, fun((FES) -> gleam@json:json())) -> payload().
encode(Value, Encoder) ->
    {payload,
        <<"application/json"/utf8>>,
        begin
            _pipe = Value,
            _pipe@1 = Encoder(_pipe),
            gleam@json:to_string(_pipe@1)
        end}.

-file("src/aion_client/payload.gleam", 39).
-spec map_decode_error({ok, FEX} | {error, gleam@json:decode_error()}) -> {ok,
        FEX} |
    {error, aion_client@error:error()}.
map_decode_error(Result) ->
    case Result of
        {ok, Value} ->
            {ok, Value};

        {error, _} ->
            {error, invalid_argument}
    end.

-file("src/aion_client/payload.gleam", 27).
?DOC(
    " Decode a JSON Payload into a typed value. Decode failures are explicit data\n"
    " and map to InvalidArgument rather than panicking or silently defaulting.\n"
).
-spec decode(payload(), gleam@dynamic@decode:decoder(FET)) -> {ok, FET} |
    {error, aion_client@error:error()}.
decode(Payload, Decoder) ->
    {payload, Content_type, Bytes} = Payload,
    case Content_type =:= <<"application/json"/utf8>> of
        true ->
            _pipe = Bytes,
            _pipe@1 = gleam@json:parse(_pipe, Decoder),
            map_decode_error(_pipe@1);

        false ->
            {error, invalid_argument}
    end.