Packages
ex_aws
2.5.0
2.7.0
2.6.1
2.6.0
2.5.11
2.5.10
2.5.9
2.5.8
2.5.7
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.1
1.0.0-beta3
1.0.0-beta2
1.0.0-beta1
1.0.0-beta0
0.5.0
0.4.19
0.4.18
0.4.17
0.4.15
0.4.14
0.4.13
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
AWS client for Elixir. Currently supports Dynamo, DynamoStreams, EC2, Firehose, Kinesis, KMS, Lambda, RRDS, Route53, S3, SES, SNS, SQS, STS and others.
Current section
Files
Jump to
Current section
Files
lib/ex_aws/operation/json.ex
defmodule ExAws.Operation.JSON do
@moduledoc """
Datastructure representing an operation on a JSON based AWS service.
This module is generally not used directly, but rather is constructed by one
of the relevant AWS services.
These include:
- DynamoDB
- Kinesis
- Lambda (Rest style)
- ElasticTranscoder
JSON services are generally pretty simple. You just need to populate the `data`
attribute with whatever request body parameters need converted to JSON, and set
any service specific headers.
The `before_request`
"""
defstruct stream_builder: nil,
http_method: :post,
parser: &Function.identity/1,
error_parser: &Function.identity/1,
path: "/",
data: %{},
params: %{},
headers: [],
service: nil,
before_request: nil
@type t :: %__MODULE__{}
def new(service, opts) do
struct(%__MODULE__{service: service}, opts)
end
end
defimpl ExAws.Operation, for: ExAws.Operation.JSON do
@type response_t :: %{} | ExAws.Request.error_t()
def perform(operation, config) do
operation = handle_callbacks(operation, config)
url = ExAws.Request.Url.build(operation, config)
headers = [
{"x-amz-content-sha256", ""} | operation.headers
]
ExAws.Request.request(
operation.http_method,
url,
operation.data,
headers,
config,
operation.service
)
|> operation.error_parser.()
|> ExAws.Request.default_aws_error()
|> parse(config)
end
def stream!(%ExAws.Operation.JSON{stream_builder: nil}, _) do
raise ArgumentError, """
This operation does not support streaming!
"""
end
def stream!(%ExAws.Operation.JSON{stream_builder: stream_builder}, config_overrides) do
stream_builder.(config_overrides)
end
defp handle_callbacks(%{before_request: nil} = op, _), do: op
defp handle_callbacks(%{before_request: callback} = op, config) do
callback.(op, config)
end
defp parse({:error, result}, _), do: {:error, result}
defp parse({:ok, %{body: ""}}, _), do: {:ok, %{}}
defp parse({:ok, %{body: body}}, config) do
{:ok, config[:json_codec].decode!(body)}
end
end