Packages
ex_aws
0.4.1
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/client.ex
defmodule ExAws.Client do
@moduledoc false
# Generates boilerplate for client configuration and implementation.
# It uses the functions in Impl as the list to generate from, so that
# the built in behaviour checking logic can operate normally.
#
# However, the impl list is filtered according to the callback list
def generate_boilerplate(client, opts) do
config_boilerplate = create_config_boilerplate(client, opts)
{:module, impl_module} = impl_module(client)
functions = impl_module.__info__(:functions)
generated_functions = functions
|> Enum.sort_by(&elem(&1, 1))
|> Enum.map(&generate_function(&1, impl_module))
{:__block__, [], [config_boilerplate | generated_functions]}
end
def create_config_boilerplate(client, opts) do
quote do
@moduledoc false
@otp_app Keyword.get(unquote(opts), :otp_app)
@behaviour unquote(client)
def new(opts \\ []) do
%__MODULE__{}
|> ExAws.Config.build(opts)
end
@doc false
def config_root, do: Application.get_env(@otp_app, :ex_aws)
end
end
## This generates a function that looks like the following for a client named
# `ExAws.Example.Client`
# @doc false
# def function_name(arg1, arg2, ...) do
# ExAws.Example.Impl.function_name(__MODULE__, arg1, arg2, ....)
# end
def generate_function({name, var_count}, impl_module) do
arguments = build_arguments(var_count - 1)
{:def, [], [{name, [], arguments}, [do: {
# Function call to the Impl.function_name
{:., [], [impl_module, name]}, [],
# Append client_data to the function arguments passed to
# The implementation function.
[new_client_struct | arguments]
}]]}
end
def new_client_struct do
quote do: __MODULE__.new
end
# ExAws.Dynamo.Client #=> ExAws.Dynamo.Impl
def impl_module(client) do
client
|> Atom.to_string
|> String.replace("Client", "Impl")
|> String.to_atom
|> Code.ensure_compiled
end
def build_arguments(n) when n > 0 do
Stream.iterate(0, &(&1 + 1))
|> Stream.map(&("arg#{&1}"))
|> Stream.map(&String.to_atom/1)
|> Enum.take(n)
|> Enum.map(fn(var) -> {var, [], Elixir} end)
end
def build_arguments(_), do: []
end