Skip to main content

src/d1_gleamflare@database.erl

-module(d1_gleamflare@database).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/d1_gleamflare/database.gleam").
-export([query_to_json/1, query_meta_decoder/0, query_result_decoder/1, 'query'/4, query_dynamic/3, raw_query/3, batch/2, delete/1]).

-file("src/d1_gleamflare/database.gleam", 10).
-spec query_to_json(d1_gleamflare@types:'query'()) -> gleam@json:json().
query_to_json(Q) ->
    gleam@json:object(
        [{<<"sql"/utf8>>, gleam@json:string(erlang:element(2, Q))},
            {<<"params"/utf8>>,
                gleam@json:array(erlang:element(3, Q), fun(X) -> X end)}]
    ).

-file("src/d1_gleamflare/database.gleam", 28).
-spec map_option_default(
    fun((gleam@dynamic:dynamic_()) -> {ok, gleam@option:option(HFV)} |
        {error, list(gleam@dynamic:decode_error())}),
    HFV
) -> fun((gleam@dynamic:dynamic_()) -> {ok, HFV} |
    {error, list(gleam@dynamic:decode_error())}).
map_option_default(Decoder, Default) ->
    fun(D) -> case Decoder(D) of
            {ok, Opt} ->
                {ok, gleam@option:unwrap(Opt, Default)};

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

-file("src/d1_gleamflare/database.gleam", 17).
-spec query_meta_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
        d1_gleamflare@types:query_meta()} |
    {error, list(gleam@dynamic:decode_error())}).
query_meta_decoder() ->
    gleam@dynamic:decode5(
        fun(Field@0, Field@1, Field@2, Field@3, Field@4) -> {query_meta, Field@0, Field@1, Field@2, Field@3, Field@4} end,
        gleam@dynamic:field(<<"duration"/utf8>>, fun gleam@dynamic:float/1),
        gleam@dynamic:field(<<"changes"/utf8>>, fun gleam@dynamic:int/1),
        gleam@dynamic:field(<<"last_row_id"/utf8>>, fun gleam@dynamic:int/1),
        begin
            _pipe = d1_gleamflare@internal:optional_field(
                <<"rows_read"/utf8>>,
                fun gleam@dynamic:int/1
            ),
            map_option_default(_pipe, 0)
        end,
        begin
            _pipe@1 = d1_gleamflare@internal:optional_field(
                <<"rows_written"/utf8>>,
                fun gleam@dynamic:int/1
            ),
            map_option_default(_pipe@1, 0)
        end
    ).

-file("src/d1_gleamflare/database.gleam", 37).
-spec query_result_decoder(
    fun((gleam@dynamic:dynamic_()) -> {ok, HFZ} |
        {error, list(gleam@dynamic:decode_error())})
) -> fun((gleam@dynamic:dynamic_()) -> {ok,
        d1_gleamflare@types:query_result(HFZ)} |
    {error, list(gleam@dynamic:decode_error())}).
query_result_decoder(Row_decoder) ->
    gleam@dynamic:decode3(
        fun(Field@0, Field@1, Field@2) -> {query_result, Field@0, Field@1, Field@2} end,
        begin
            _pipe = d1_gleamflare@internal:optional_field(
                <<"results"/utf8>>,
                gleam@dynamic:list(Row_decoder)
            ),
            map_option_default(_pipe, [])
        end,
        gleam@dynamic:field(<<"success"/utf8>>, fun gleam@dynamic:bool/1),
        gleam@dynamic:field(<<"meta"/utf8>>, query_meta_decoder())
    ).

-file("src/d1_gleamflare/database.gleam", 47).
-spec 'query'(
    d1_gleamflare@types:database(),
    binary(),
    list(gleam@json:json()),
    fun((gleam@dynamic:dynamic_()) -> {ok, HGE} |
        {error, list(gleam@dynamic:decode_error())})
) -> {ok, d1_gleamflare@types:query_result(HGE)} |
    {error, d1_gleamflare@types:error()}.
'query'(Db, Sql, Params, Decoder) ->
    Body = begin
        _pipe = gleam@json:object(
            [{<<"sql"/utf8>>, gleam@json:string(Sql)},
                {<<"params"/utf8>>, gleam@json:array(Params, fun(X) -> X end)}]
        ),
        gleam@json:to_string(_pipe)
    end,
    Req = begin
        _pipe@1 = d1_gleamflare@internal:base_request(erlang:element(2, Db)),
        _pipe@2 = gleam@http@request:set_method(_pipe@1, post),
        _pipe@3 = gleam@http@request:set_path(
            _pipe@2,
            <<<<<<<<"/client/v4/accounts/"/utf8,
                            (erlang:element(2, erlang:element(2, Db)))/binary>>/binary,
                        "/d1/database/"/utf8>>/binary,
                    (erlang:element(3, Db))/binary>>/binary,
                "/query"/utf8>>
        ),
        gleam@http@request:set_body(_pipe@3, Body)
    end,
    case d1_gleamflare@internal:send_request(
        Req,
        gleam@dynamic:list(query_result_decoder(Decoder))
    ) of
        {ok, Results} ->
            case gleam@list:first(Results) of
                {ok, Res} ->
                    {ok, Res};

                {error, _} ->
                    {error,
                        {json_error,
                            <<"Cloudflare API returned an empty result list"/utf8>>}}
            end;

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

-file("src/d1_gleamflare/database.gleam", 83).
-spec query_dynamic(
    d1_gleamflare@types:database(),
    binary(),
    list(gleam@json:json())
) -> {ok, d1_gleamflare@types:query_result(gleam@dynamic:dynamic_())} |
    {error, d1_gleamflare@types:error()}.
query_dynamic(Db, Sql, Params) ->
    'query'(Db, Sql, Params, fun gleam@dynamic:dynamic/1).

-file("src/d1_gleamflare/database.gleam", 91).
-spec raw_query(
    d1_gleamflare@types:database(),
    binary(),
    list(gleam@json:json())
) -> {ok, list(list(gleam@dynamic:dynamic_()))} |
    {error, d1_gleamflare@types:error()}.
raw_query(Db, Sql, Params) ->
    Body = begin
        _pipe = gleam@json:object(
            [{<<"sql"/utf8>>, gleam@json:string(Sql)},
                {<<"params"/utf8>>, gleam@json:array(Params, fun(X) -> X end)}]
        ),
        gleam@json:to_string(_pipe)
    end,
    Req = begin
        _pipe@1 = d1_gleamflare@internal:base_request(erlang:element(2, Db)),
        _pipe@2 = gleam@http@request:set_method(_pipe@1, post),
        _pipe@3 = gleam@http@request:set_path(
            _pipe@2,
            <<<<<<<<"/client/v4/accounts/"/utf8,
                            (erlang:element(2, erlang:element(2, Db)))/binary>>/binary,
                        "/d1/database/"/utf8>>/binary,
                    (erlang:element(3, Db))/binary>>/binary,
                "/raw"/utf8>>
        ),
        gleam@http@request:set_body(_pipe@3, Body)
    end,
    Decoder = gleam@dynamic:list(
        gleam@dynamic:field(
            <<"results"/utf8>>,
            gleam@dynamic:field(
                <<"rows"/utf8>>,
                gleam@dynamic:list(
                    gleam@dynamic:list(fun gleam@dynamic:dynamic/1)
                )
            )
        )
    ),
    case d1_gleamflare@internal:send_request(Req, Decoder) of
        {ok, Results} ->
            case gleam@list:first(Results) of
                {ok, Res} ->
                    {ok, Res};

                {error, _} ->
                    {error,
                        {json_error,
                            <<"Cloudflare API returned an empty result list"/utf8>>}}
            end;

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

-file("src/d1_gleamflare/database.gleam", 128).
-spec batch(d1_gleamflare@types:database(), list(d1_gleamflare@types:'query'())) -> {ok,
        list(d1_gleamflare@types:query_result(gleam@dynamic:dynamic_()))} |
    {error, d1_gleamflare@types:error()}.
batch(Db, Queries) ->
    Body = begin
        _pipe = gleam@json:object(
            [{<<"batch"/utf8>>, gleam@json:array(Queries, fun query_to_json/1)}]
        ),
        gleam@json:to_string(_pipe)
    end,
    Req = begin
        _pipe@1 = d1_gleamflare@internal:base_request(erlang:element(2, Db)),
        _pipe@2 = gleam@http@request:set_method(_pipe@1, post),
        _pipe@3 = gleam@http@request:set_path(
            _pipe@2,
            <<<<<<<<"/client/v4/accounts/"/utf8,
                            (erlang:element(2, erlang:element(2, Db)))/binary>>/binary,
                        "/d1/database/"/utf8>>/binary,
                    (erlang:element(3, Db))/binary>>/binary,
                "/query"/utf8>>
        ),
        gleam@http@request:set_body(_pipe@3, Body)
    end,
    d1_gleamflare@internal:send_request(
        Req,
        gleam@dynamic:list(query_result_decoder(fun gleam@dynamic:dynamic/1))
    ).

-file("src/d1_gleamflare/database.gleam", 151).
-spec delete(d1_gleamflare@types:database()) -> {ok, nil} |
    {error, d1_gleamflare@types:error()}.
delete(Db) ->
    Req = begin
        _pipe = d1_gleamflare@internal:base_request(erlang:element(2, Db)),
        _pipe@1 = gleam@http@request:set_method(_pipe, delete),
        gleam@http@request:set_path(
            _pipe@1,
            <<<<<<"/client/v4/accounts/"/utf8,
                        (erlang:element(2, erlang:element(2, Db)))/binary>>/binary,
                    "/d1/database/"/utf8>>/binary,
                (erlang:element(3, Db))/binary>>
        )
    end,
    d1_gleamflare@internal:send_request(Req, fun(_) -> {ok, nil} end).