Skip to content

Commit feec7b3

Browse files
authored
Merge pull request #117 from thoroai/feat/add-custom-metadata-support
Adds support for custom metadata for aws-elixir.
2 parents 879a665 + 205ae17 commit feec7b3

5 files changed

Lines changed: 11263 additions & 6 deletions

File tree

lib/aws_codegen/rest_service.ex

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ defmodule AWS.CodeGen.RestService do
256256
function_name = AWS.CodeGen.Name.to_snake_case(operation)
257257
request_header_parameters = collect_request_header_parameters(language, api_spec, operation)
258258

259+
request_headers_parameters =
260+
collect_request_headers_parameters(language, api_spec, operation)
261+
259262
is_required = fn param -> param.required end
260263
required_query_parameters = Enum.filter(query_parameters, is_required)
261264
required_request_header_parameters = Enum.filter(request_header_parameters, is_required)
@@ -266,7 +269,8 @@ defmodule AWS.CodeGen.RestService do
266269
"GET" ->
267270
case language do
268271
:elixir ->
269-
2 + length(request_header_parameters) + length(query_parameters)
272+
2 + length(request_header_parameters) + length(request_headers_parameters) +
273+
length(query_parameters)
270274

271275
:erlang ->
272276
4 + length(required_request_header_parameters) + length(required_query_parameters)
@@ -295,6 +299,7 @@ defmodule AWS.CodeGen.RestService do
295299
query_parameters: query_parameters,
296300
required_query_parameters: required_query_parameters,
297301
request_header_parameters: request_header_parameters,
302+
request_headers_parameters: request_headers_parameters,
298303
required_request_header_parameters: required_request_header_parameters,
299304
response_header_parameters:
300305
collect_response_header_parameters(language, api_spec, operation),
@@ -338,6 +343,10 @@ defmodule AWS.CodeGen.RestService do
338343
collect_parameters(language, api_spec, operation, "input", "smithy.api#httpHeader")
339344
end
340345

346+
defp collect_request_headers_parameters(language, api_spec, operation) do
347+
collect_parameters(language, api_spec, operation, "input", "smithy.api#httpPrefixHeaders")
348+
end
349+
341350
defp collect_response_header_parameters(language, api_spec, operation) do
342351
collect_parameters(language, api_spec, operation, "output", "smithy.api#httpHeader")
343352
end

priv/rest.ex.eex

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,13 @@ def <%= action.function_name %>(%Client{} = client<%= AWS.CodeGen.RestService.fu
123123
{"<%= parameter.name %>", "<%= parameter.location_name %>"},<% end %>
124124
]
125125
|> Request.build_params(input)<% else %>
126-
headers = []<% end %><%= if length(action.query_parameters) > 0 do %>
126+
headers = []<% end %><%= if length(action.request_headers_parameters) > 0 do %>
127+
{custom_headers, input} =
128+
[<%= for parameter <- action.request_headers_parameters do %>
129+
{"<%= parameter.name %>", "<%= parameter.location_name %>"},<% end %>
130+
]
131+
|> Request.build_params(input)<% else %>
132+
custom_headers = []<% end %><%= if length(action.query_parameters) > 0 do %>
127133
{query_params, input} =
128134
[<%= for parameter <- action.query_parameters do %>
129135
{"<%= parameter.name %>", "<%= parameter.location_name %>"},<% end %>
@@ -166,6 +172,6 @@ def <%= action.function_name %>(%Client{} = client<%= AWS.CodeGen.RestService.fu
166172
meta = metadata()
167173
<% end %>
168174

169-
Request.request_rest(client, meta, <%= AWS.CodeGen.RestService.Action.method(action) %>, url_path, query_params, headers, input, options, <%= inspect(action.success_status_code) %>)<% end %>
175+
Request.request_rest(client, meta, <%= AWS.CodeGen.RestService.Action.method(action) %>, url_path, query_params, custom_headers ++ headers, input, options, <%= inspect(action.success_status_code) %>)<% end %>
170176
end<% end %>
171177
end

test/aws_codegen_test.exs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ defmodule AWS.CodeGenTest do
1414
}
1515
}
1616

17+
@service_spec_custom_headers_file "test/fixtures/apis_specs/dataexchange.json"
18+
@service_spec_custom_headers_generated "test/fixtures/generated/data_exchange.ex"
19+
1720
setup do
1821
service_specs =
1922
@service_spec_file
@@ -24,7 +27,7 @@ defmodule AWS.CodeGenTest do
2427
end
2528

2629
describe "render/2" do
27-
defp setup_context(language, specs, docs \\ nil) do
30+
defp setup_context(language, specs, _docs \\ nil) do
2831
spec = %AWS.CodeGen.Spec{
2932
api: specs,
3033
module_name: "AWS.CloudTrailData",
@@ -37,6 +40,19 @@ defmodule AWS.CodeGenTest do
3740
RestService.load_context(language, spec, @endpoints_spec)
3841
end
3942

43+
defp setup_dataexchange_context(language, specs, _docs \\ nil) do
44+
spec = %AWS.CodeGen.Spec{
45+
api: specs,
46+
module_name: "AWS.DataExchange",
47+
filename: "data_exchange.ex",
48+
protocol: :rest_json,
49+
language: :elixir,
50+
shape_name: "com.amazonaws.dataexchange#DataExchange"
51+
}
52+
53+
RestService.load_context(language, spec, @endpoints_spec)
54+
end
55+
4056
test "renders the Elixir module with docs", %{specs: specs} do
4157
context = setup_context(:elixir, specs)
4258

@@ -238,6 +254,7 @@ defmodule AWS.CodeGenTest do
238254
def put_audit_events(%Client{} = client, input, options \\\\ []) do
239255
url_path = \"/PutAuditEvents\"
240256
headers = []
257+
custom_headers = []
241258
242259
{query_params, input} =
243260
[
@@ -254,7 +271,7 @@ defmodule AWS.CodeGenTest do
254271
:post,
255272
url_path,
256273
query_params,
257-
headers,
274+
custom_headers ++ headers,
258275
input,
259276
options,
260277
200
@@ -717,6 +734,7 @@ defmodule AWS.CodeGenTest do
717734
def put_audit_events(%Client{} = client, input, options \\\\ []) do
718735
url_path = \"/PutAuditEvents\"
719736
headers = []
737+
custom_headers = []
720738
721739
{query_params, input} =
722740
[
@@ -733,7 +751,7 @@ defmodule AWS.CodeGenTest do
733751
:post,
734752
url_path,
735753
query_params,
736-
headers,
754+
custom_headers ++ headers,
737755
input,
738756
options,
739757
200
@@ -742,5 +760,22 @@ defmodule AWS.CodeGenTest do
742760
end
743761
""")
744762
end
763+
764+
test "renders the Elixir module with custom headers" do
765+
specs_file =
766+
@service_spec_custom_headers_file
767+
|> File.read!()
768+
|> Poison.decode!()
769+
770+
context = setup_dataexchange_context(:elixir, specs_file)
771+
772+
result =
773+
context
774+
|> AWS.CodeGen.render("priv/rest.ex.eex")
775+
|> IO.iodata_to_binary()
776+
777+
generated = File.read!(@service_spec_custom_headers_generated)
778+
assert result == generated
779+
end
745780
end
746781
end

0 commit comments

Comments
 (0)