Skip to main content

src/d1_gleamflare@internal.erl

-module(d1_gleamflare@internal).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/d1_gleamflare/internal.gleam").
-export([api_error_decoder/0, optional_field/2, envelope_decoder/0, base_request/1, stringify_errors/1, stringify_httpc_error/1, send_request/2]).
-export_type([envelope/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(false).

-type envelope() :: {envelope,
        boolean(),
        list(d1_gleamflare@types:cloudflare_api_error()),
        gleam@option:option(gleam@dynamic:dynamic_())}.

-file("src/d1_gleamflare/internal.gleam", 19).
?DOC(false).
-spec api_error_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
        d1_gleamflare@types:cloudflare_api_error()} |
    {error, list(gleam@dynamic:decode_error())}).
api_error_decoder() ->
    gleam@dynamic:decode2(
        fun(Field@0, Field@1) -> {cloudflare_api_error, Field@0, Field@1} end,
        gleam@dynamic:field(<<"code"/utf8>>, fun gleam@dynamic:int/1),
        gleam@dynamic:field(<<"message"/utf8>>, fun gleam@dynamic:string/1)
    ).

-file("src/d1_gleamflare/internal.gleam", 27).
?DOC(false).
-spec optional_field(
    binary(),
    fun((gleam@dynamic:dynamic_()) -> {ok, HAB} |
        {error, list(gleam@dynamic:decode_error())})
) -> fun((gleam@dynamic:dynamic_()) -> {ok, gleam@option:option(HAB)} |
    {error, list(gleam@dynamic:decode_error())}).
optional_field(Name, Inner) ->
    fun(D) ->
        case (gleam@dynamic:field(Name, gleam@dynamic:optional(Inner)))(D) of
            {ok, Opt} ->
                {ok, Opt};

            {error,
                [{decode_error, <<"field"/utf8>>, <<"nothing"/utf8>>, Path}]} when Path =:= [Name] ->
                {ok, none};

            {error, Errs} ->
                {error, Errs}
        end
    end.

-file("src/d1_gleamflare/internal.gleam", 40).
?DOC(false).
-spec envelope_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, envelope()} |
    {error, list(gleam@dynamic:decode_error())}).
envelope_decoder() ->
    gleam@dynamic:decode3(
        fun(Field@0, Field@1, Field@2) -> {envelope, Field@0, Field@1, Field@2} end,
        gleam@dynamic:field(<<"success"/utf8>>, fun gleam@dynamic:bool/1),
        gleam@dynamic:field(
            <<"errors"/utf8>>,
            gleam@dynamic:list(api_error_decoder())
        ),
        optional_field(<<"result"/utf8>>, fun gleam@dynamic:dynamic/1)
    ).

-file("src/d1_gleamflare/internal.gleam", 49).
?DOC(false).
-spec base_request(d1_gleamflare@types:client()) -> gleam@http@request:request(binary()).
base_request(Client) ->
    _pipe = gleam@http@request:new(),
    _pipe@1 = gleam@http@request:set_scheme(_pipe, https),
    _pipe@2 = gleam@http@request:set_host(
        _pipe@1,
        <<"api.cloudflare.com"/utf8>>
    ),
    _pipe@3 = gleam@http@request:set_header(
        _pipe@2,
        <<"authorization"/utf8>>,
        <<"Bearer "/utf8, (erlang:element(3, Client))/binary>>
    ),
    _pipe@4 = gleam@http@request:set_header(
        _pipe@3,
        <<"content-type"/utf8>>,
        <<"application/json"/utf8>>
    ),
    _pipe@5 = gleam@http@request:set_header(
        _pipe@4,
        <<"accept"/utf8>>,
        <<"application/json"/utf8>>
    ),
    gleam@http@request:set_body(_pipe@5, <<""/utf8>>).

-file("src/d1_gleamflare/internal.gleam", 59).
?DOC(false).
-spec stringify_errors(list(gleam@dynamic:decode_error())) -> binary().
stringify_errors(Errors) ->
    _pipe = Errors,
    _pipe@1 = gleam@list:map(
        _pipe,
        fun(Err) ->
            <<<<<<<<<<(erlang:element(2, Err))/binary, " at "/utf8>>/binary,
                            (gleam@string:join(
                                erlang:element(4, Err),
                                <<"."/utf8>>
                            ))/binary>>/binary,
                        " (found: "/utf8>>/binary,
                    (erlang:element(3, Err))/binary>>/binary,
                ")"/utf8>>
        end
    ),
    gleam@string:join(_pipe@1, <<", "/utf8>>).

-file("src/d1_gleamflare/internal.gleam", 116).
?DOC(false).
-spec stringify_httpc_error(any()) -> binary().
stringify_httpc_error(Err) ->
    gleam@string:inspect(Err).

-file("src/d1_gleamflare/internal.gleam", 67).
?DOC(false).
-spec send_request(
    gleam@http@request:request(binary()),
    fun((gleam@dynamic:dynamic_()) -> {ok, HAJ} |
        {error, list(gleam@dynamic:decode_error())})
) -> {ok, HAJ} | {error, d1_gleamflare@types:error()}.
send_request(Req, Result_decoder) ->
    case gleam@httpc:send(Req) of
        {ok, Res} ->
            case gleam@json:decode(erlang:element(4, Res), envelope_decoder()) of
                {ok, Envelope} ->
                    case erlang:element(2, Envelope) of
                        true ->
                            case erlang:element(4, Envelope) of
                                {some, Res_dynamic} ->
                                    case Result_decoder(Res_dynamic) of
                                        {ok, Val} ->
                                            {ok, Val};

                                        {error, Errs} ->
                                            {error,
                                                {json_error,
                                                    <<"Failed to decode response result: "/utf8,
                                                        (stringify_errors(Errs))/binary>>}}
                                    end;

                                none ->
                                    case Result_decoder(
                                        gleam_stdlib:identity(nil)
                                    ) of
                                        {ok, Val@1} ->
                                            {ok, Val@1};

                                        {error, Errs@1} ->
                                            {error,
                                                {json_error,
                                                    <<"Expected result field but it was missing: "/utf8,
                                                        (stringify_errors(
                                                            Errs@1
                                                        ))/binary>>}}
                                    end
                            end;

                        false ->
                            {error, {api_error, erlang:element(3, Envelope)}}
                    end;

                {error, Json_err} ->
                    case (erlang:element(2, Res) < 200) orelse (erlang:element(
                        2,
                        Res
                    )
                    >= 300) of
                        true ->
                            {error,
                                {http_error,
                                    erlang:element(2, Res),
                                    erlang:element(4, Res)}};

                        false ->
                            {error,
                                {json_error,
                                    <<"Failed to decode JSON: "/utf8,
                                        (gleam@string:inspect(Json_err))/binary>>}}
                    end
            end;

        {error, Httpc_err} ->
            {error, {network_error, stringify_httpc_error(Httpc_err)}}
    end.