Packages
erlcloud
3.6.5
3.8.3
3.8.2
3.8.1
3.7.6
3.7.4
3.7.3
3.7.2
3.7.1
3.7.0
3.6.8
3.6.7
3.6.5
3.6.4
3.6.3
3.6.2
3.6.1
3.6.0
3.5.16
3.5.15
3.5.14
3.5.13
3.5.12
3.5.11
3.5.10
3.5.9
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.4.5
3.4.3
3.4.1
3.4.0
3.3.9
3.3.8
3.3.7
3.3.6
3.3.5
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.18
3.2.17
3.2.16
3.2.15
3.2.14
3.2.13
3.2.12
3.2.11
3.2.10
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.17
3.1.16
3.1.14
3.1.13
3.1.12
3.1.11
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
2.2.16
2.2.15
2.2.14
2.2.13
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.2
2.2.1
2.2.0
2.1.0
2.0.5
2.0.4
2.0.3
2.0.0
0.13.10
0.13.9
0.13.8
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.0
0.12.0
0.11.0
0.9.2
0.9.2-rc.1
0.9.1
0.9.0
AWS APIs library for Erlang
Current section
Files
Jump to
Current section
Files
src/erlcloud_cur.erl
-module(erlcloud_cur).
%% AWS Cost and Usage Report API implementation
%% https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/api-reference.html
-include("erlcloud_aws.hrl").
%% Initialization API
-export([new/2, new/3, new/4, new/5]).
%% API
-export([
describe_report_definitions/1,
describe_report_definitions/2
]).
%%------------------------------------------------------------------------------
%% Initialization API
%%------------------------------------------------------------------------------
-spec new(string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
cur_host = Host,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string(), non_neg_integer()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host, Port) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
cur_host = Host,
cur_port = Port,
retry = fun erlcloud_retry:default_retry/1}.
-spec new(string(), string(), string(), non_neg_integer(), string()) ->
aws_config().
new(AccessKeyID, SecretAccessKey, Host, Port, Scheme) ->
#aws_config{access_key_id = AccessKeyID,
secret_access_key = SecretAccessKey,
cur_host = Host,
cur_port = Port,
cur_scheme = Scheme,
retry = fun erlcloud_retry:default_retry/1}.
%%------------------------------------------------------------------------------
%% API
%%------------------------------------------------------------------------------
%% @doc
%% Cost & Usage Report API:
%% https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/describe-report-definitions.html
%%
%% `
%% {ok, R} = erlcloud_cur:describe_report_definitions(Config).
%% `
%%
-spec describe_report_definitions(aws_config()) -> {ok, map()} | {error, any()}.
describe_report_definitions(Config) ->
describe_report_definitions(#{}, Config).
%% `
%% Opts = #{<<"MaxResults">> => 5},
%% {ok, R} = erlcloud_cur:describe_report_definitions(Opts, Config).
%% `
-spec describe_report_definitions(map(), aws_config()) -> {ok, map()} | {error, any()}.
describe_report_definitions(Options, Config) ->
request(Config, <<"DescribeReportDefinitions">>, Options).
%%------------------------------------------------------------------------------
%% Internal Functions
%%------------------------------------------------------------------------------
request(Config0, Operation, Input) ->
case erlcloud_aws:update_config(Config0) of
{ok, Config} ->
Body = jsx:encode(Input),
Headers = get_headers(Config, Operation, Body),
AwsRequest = #aws_request{service = cur,
uri = get_url(Config),
method = post,
request_headers = Headers,
request_body = Body},
request(Config, AwsRequest);
{error, Reason} ->
{error, Reason}
end.
request(Config, Request) ->
Result = erlcloud_retry:request(Config, Request, fun handle_result/1),
case erlcloud_aws:request_to_return(Result) of
{ok, {_, <<>>}} -> {ok, #{}};
{ok, {_, RespBody}} ->
{ok, jsx:decode(RespBody, [return_maps])};
{error, _} = Error -> Error
end.
handle_result(#aws_request{response_type = ok} = Request) ->
Request;
handle_result(#aws_request{response_type = error,
error_type = aws,
response_status = Status} = Request)
when Status >= 500 ->
Request#aws_request{should_retry = true};
handle_result(#aws_request{response_type = error,
error_type = aws} = Request) ->
Request#aws_request{should_retry = false}.
get_headers(#aws_config{cur_host = Host} = Config, Operation, Body) ->
Headers = [{"host", Host},
{"x-amz-target", make_amz_target(Operation)},
{"content-type", "application/x-amz-json-1.1"}],
Region = erlcloud_aws:aws_region_from_host(Host),
erlcloud_aws:sign_v4_headers(Config, Headers, Body, Region, "cur").
get_url(#aws_config{cur_scheme = Scheme,
cur_host = Host,
cur_port = Port}) ->
Scheme ++ Host ++ ":" ++ integer_to_list(Port).
make_amz_target(Operation) ->
"AWSOrigamiServiceGatewayService." ++ binary_to_list(Operation).