[Erlang] erlang client: properly handle optional parameters (#7042)

* erlang client: properly handle optional parameters

* [Erlang Client] handle multiple path params in the same path
This commit is contained in:
Tristan Sloughter 2017-11-27 00:11:14 -08:00 committed by William Cheng
parent 7a15121f94
commit 3d3a30a533
12 changed files with 214 additions and 104 deletions

View File

@ -163,10 +163,12 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
public String qsEncode(Object o) { public String qsEncode(Object o) {
String r = new String(); String r = new String();
CodegenParameter q = (CodegenParameter) o; CodegenParameter q = (CodegenParameter) o;
if (q.isListContainer) { if (q.required) {
r += "[{<<\"" + q.baseName + "\">>, X} || X <- " + q.paramName + "]"; if (q.isListContainer) {
} else { r += "[{<<\"" + q.baseName + "\">>, X} || X <- " + q.paramName + "]";
r += "{<<\"" + q.baseName + "\">>, " + q.paramName + "}"; } else {
r += "{<<\"" + q.baseName + "\">>, " + q.paramName + "}";
}
} }
return r; return r;
} }
@ -257,7 +259,7 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
Map<String, Object> operations = (Map<String, Object>) objs.get("operations"); Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
List<CodegenOperation> os = (List<CodegenOperation>) operations.get("operation"); List<CodegenOperation> os = (List<CodegenOperation>) operations.get("operation");
List<ExtendedCodegenOperation> newOs = new ArrayList<ExtendedCodegenOperation>(); List<ExtendedCodegenOperation> newOs = new ArrayList<ExtendedCodegenOperation>();
Pattern pattern = Pattern.compile("(.*)\\{([^\\}]+)\\}(.*)"); Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}");
for (CodegenOperation o : os) { for (CodegenOperation o : os) {
// force http method to lower case // force http method to lower case
o.httpMethod = o.httpMethod.toLowerCase(); o.httpMethod = o.httpMethod.toLowerCase();
@ -270,10 +272,12 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
Matcher matcher = pattern.matcher(o.path); Matcher matcher = pattern.matcher(o.path);
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
while (matcher.find()) { while (matcher.find()) {
String pathTemplateName = matcher.group(2); String pathTemplateName = matcher.group(1);
matcher.appendReplacement(buffer, "$1" + "\", " + camelize(pathTemplateName) + ", \"" + "$3"); matcher.appendReplacement(buffer, "\", " + camelize(pathTemplateName) + ", \"");
pathTemplateNames.add(pathTemplateName); pathTemplateNames.add(pathTemplateName);
} }
matcher.appendTail(buffer);
ExtendedCodegenOperation eco = new ExtendedCodegenOperation(o); ExtendedCodegenOperation eco = new ExtendedCodegenOperation(o);
if (buffer.toString().isEmpty()) { if (buffer.toString().isEmpty()) {
eco.setReplacedPathName(o.path); eco.setReplacedPathName(o.path);
@ -295,8 +299,26 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
this.packageVersion = packageVersion; this.packageVersion = packageVersion;
} }
String length(Object o) { String length(Object os) {
return Integer.toString((((ExtendedCodegenOperation) o).allParams).size()); int l = 1;
for (CodegenParameter o : ((ExtendedCodegenOperation) os).allParams) {
CodegenParameter q = (CodegenParameter) o;
if (q.required)
l++;
}
return Integer.toString(l);
}
int lengthRequired(List<CodegenParameter> allParams) {
int l = 0;
for (CodegenParameter o : allParams) {
CodegenParameter q = (CodegenParameter) o;
if (q.required || q.isBodyParam)
l++;
}
return l;
} }
@Override @Override
@ -313,6 +335,8 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
class ExtendedCodegenOperation extends CodegenOperation { class ExtendedCodegenOperation extends CodegenOperation {
private List<String> pathTemplateNames = new ArrayList<String>(); private List<String> pathTemplateNames = new ArrayList<String>();
private String replacedPathName; private String replacedPathName;
String arityRequired;
String arityOptional;
public ExtendedCodegenOperation(CodegenOperation o) { public ExtendedCodegenOperation(CodegenOperation o) {
super(); super();
@ -355,6 +379,8 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig
this.produces = o.produces; this.produces = o.produces;
this.bodyParam = o.bodyParam; this.bodyParam = o.bodyParam;
this.allParams = o.allParams; this.allParams = o.allParams;
this.arityRequired = Integer.toString(lengthRequired(o.allParams));
this.arityOptional = Integer.toString(lengthRequired(o.allParams)+1);
this.bodyParams = o.bodyParams; this.bodyParams = o.bodyParams;
this.pathParams = o.pathParams; this.pathParams = o.pathParams;
this.queryParams = o.queryParams; this.queryParams = o.queryParams;

View File

@ -1,23 +1,27 @@
-module({{classname}}_api). -module({{classname}}_api).
-export([{{#operations}}{{#operation}}{{^-first}}, -export([{{#operations}}{{#operation}}{{^-first}},
{{/-first}}{{operationId}}/{{#length}}{{allParams}}{{/length}}{{/operation}}{{/operations}}]). {{/-first}}{{operationId}}/{{arityRequired}}, {{operationId}}/{{arityOptional}}{{/operation}}{{/operations}}]).
-define(BASE_URL, <<"{{{basePath}}}">>). -define(BASE_URL, <<"{{{basePath}}}">>).
{{#operations}} {{#operations}}
{{#operation}} {{#operation}}
%% @doc {{summary}} %% @doc {{{summary}}}
{{^notes.isEmpty}} {{^notes.isEmpty}}
%% {{notes}} %% {{{notes}}}
{{/notes.isEmpty}} {{/notes.isEmpty}}
-spec {{operationId}}({{#allParams}}{{^-first}}, {{/-first}}{{dataType}}{{/allParams}}) -> {{#returnType}}{ok, list(), {{returnType}}} | {error, string()}{{/returnType}}{{^returnType}}ok | {error, integer()}{{/returnType}}. -spec {{operationId}}({{#allParams}}{{#required}}{{^-first}}, {{/-first}}{{{dataType}}}{{/required}}{{/allParams}}{{^bodyParams.isEmpty}}{{#bodyParams}}, term(){{/bodyParams}}{{/bodyParams.isEmpty}}) -> {{#returnType}}{ok, list(), {{{returnType}}}} | {error, string()}{{/returnType}}{{^returnType}}ok | {error, integer()}{{/returnType}}.
{{operationId}}({{#allParams}}{{^-first}}, {{/-first}}{{paramName}}{{/allParams}}) -> {{operationId}}({{#allParams}}{{#required}}{{^-first}}, {{/-first}}{{paramName}}{{/required}}{{/allParams}}{{^bodyParams.isEmpty}}{{#bodyParams}}, {{paramName}}{{/bodyParams}}{{/bodyParams.isEmpty}}) ->
{{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}{{^bodyParams.isEmpty}}{{#bodyParams}}{{paramName}}, {{/bodyParams}}{{/bodyParams.isEmpty}}#{}).
-spec {{operationId}}({{#allParams}}{{#required}}{{{dataType}}}, {{/required}}{{/allParams}}{{^bodyParams.isEmpty}}{{#bodyParams}}term(), {{/bodyParams}}{{/bodyParams.isEmpty}}maps:map()) -> {{#returnType}}{ok, list(), {{{returnType}}}} | {error, string()}{{/returnType}}{{^returnType}}ok | {error, integer()}{{/returnType}}.
{{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}{{^bodyParams.isEmpty}}{{#bodyParams}}{{paramName}}{{/bodyParams}}, {{/bodyParams.isEmpty}}_Optional) ->
Method = {{httpMethod}}, Method = {{httpMethod}},
Path = ["{{{replacedPathName}}}"], Path = ["{{{replacedPathName}}}"],
QS = {{#queryParams.isEmpty}}[]{{/queryParams.isEmpty}}{{^queryParams.isEmpty}}lists:flatten([{{#queryParams}}{{^-first}}, {{/-first}}{{#qsEncode}}{{this}}{{/qsEncode}}{{/queryParams}}]){{/queryParams.isEmpty}}, QS = {{#queryParams.isEmpty}}[]{{/queryParams.isEmpty}}{{^queryParams.isEmpty}}lists:flatten([{{#queryParams}}{{#required}}{{^-first}}, {{/-first}}{{#qsEncode}}{{this}}{{/qsEncode}}{{/required}}{{/queryParams}}])++[{X, maps:get(X, _Optional)} || X <- [{{#queryParams}}{{^required}}{{^-first}}, {{/-first}}'{{baseName}}'{{/required}}{{/queryParams}}], maps:is_key(X, _Optional)]{{/queryParams.isEmpty}},
Headers = [{{^headerParams.isEmpty}}{{#headerParams}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/headerParams}}{{/headerParams.isEmpty}}], Headers = {{#headerParams.isEmpty}}[]{{/headerParams.isEmpty}}{{^headerParams.isEmpty}}[{{#headerParams}}{{#required}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/required}}{{/headerParams}}]++[{X, maps:get(X, _Optional)} || X <- [{{#headerParams}}{{^required}}{{^-first}}, {{/-first}}'{{baseName}}'{{/required}}{{/headerParams}}], maps:is_key(X, _Optional)]{{/headerParams.isEmpty}},
Body1 = {{^formParams.isEmpty}}{form, [{{#formParams}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/formParams}}]}{{/formParams.isEmpty}}{{#formParams.isEmpty}}{{#bodyParams.isEmpty}}[]{{/bodyParams.isEmpty}}{{^bodyParams.isEmpty}}{{#bodyParams}}{{paramName}}{{/bodyParams}}{{/bodyParams.isEmpty}}{{/formParams.isEmpty}}, Body1 = {{^formParams.isEmpty}}{form, [{{#formParams}}{{#required}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/required}}{{/formParams}}]++[{X, maps:get(X, _Optional)} || X <- [{{#formParams}}{{^required}}{{^-first}}, {{/-first}}'{{baseName}}'{{/required}}{{/formParams}}], maps:is_key(X, _Optional)]}{{/formParams.isEmpty}}{{#formParams.isEmpty}}{{#bodyParams.isEmpty}}[]{{/bodyParams.isEmpty}}{{^bodyParams.isEmpty}}{{#bodyParams}}{{paramName}}{{/bodyParams}}{{/bodyParams.isEmpty}}{{/formParams.isEmpty}},
Opts = [], Opts = [],
Url = hackney_url:make_url(?BASE_URL, Path, QS), Url = hackney_url:make_url(?BASE_URL, Path, QS),
@ -26,8 +30,8 @@
{{#responses}} {{#responses}}
{{#isDefault}} {{#isDefault}}
{ok, {{code}}, RespHeaders, ClientRef} -> {ok, {{code}}, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}{{#hasMore}}; {{/hasMore}} {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])}{{#hasMore}}; {{/hasMore}}
{{/isDefault}} {{/isDefault}}
{{^isDefault}} {{^isDefault}}
{ok, {{code}}, _RespHeaders, _ClientRef} -> {ok, {{code}}, _RespHeaders, _ClientRef} ->

View File

@ -2,9 +2,9 @@
{{#model}} {{#model}}
-module({{classname}}). -module({{classname}}).
-export_type([{{classname}}/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([{{classname}}/0]).
-type {{classname}}() :: -type {{classname}}() ::
#{ {{#vars}}'{{name}}' {{#required}}:={{/required}}{{^required}}=>{{/required}} {{{datatype}}}{{#hasMore}}, #{ {{#vars}}'{{name}}' {{#required}}:={{/required}}{{^required}}=>{{/required}} {{{datatype}}}{{#hasMore}},
@ -16,6 +16,6 @@ encode(#{ {{#vars}}'{{name}}' := {{{nameInCamelCase}}}{{#hasMore}},
}) -> }) ->
#{ {{#vars}}'{{baseName}}' => {{{nameInCamelCase}}}{{#hasMore}}, #{ {{#vars}}'{{baseName}}' => {{{nameInCamelCase}}}{{#hasMore}},
{{/hasMore}}{{/vars}} {{/hasMore}}{{/vars}}
} }.
{{/model}} {{/model}}
{{/models}} {{/models}}

View File

@ -1,8 +1,8 @@
-module(swagger_api_response). -module(swagger_api_response).
-export_type([swagger_api_response/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_api_response/0]).
-type swagger_api_response() :: -type swagger_api_response() ::
#{ 'code' => integer(), #{ 'code' => integer(),
@ -17,4 +17,4 @@ encode(#{ 'code' := Code,
#{ 'code' => Code, #{ 'code' => Code,
'type' => Type, 'type' => Type,
'message' => Message 'message' => Message
} }.

View File

@ -1,8 +1,8 @@
-module(swagger_category). -module(swagger_category).
-export_type([swagger_category/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_category/0]).
-type swagger_category() :: -type swagger_category() ::
#{ 'id' => integer(), #{ 'id' => integer(),
@ -14,4 +14,4 @@ encode(#{ 'id' := Id,
}) -> }) ->
#{ 'id' => Id, #{ 'id' => Id,
'name' => Name 'name' => Name
} }.

View File

@ -1,8 +1,8 @@
-module(swagger_order). -module(swagger_order).
-export_type([swagger_order/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_order/0]).
-type swagger_order() :: -type swagger_order() ::
#{ 'id' => integer(), #{ 'id' => integer(),
@ -26,4 +26,4 @@ encode(#{ 'id' := Id,
'shipDate' => ShipDate, 'shipDate' => ShipDate,
'status' => Status, 'status' => Status,
'complete' => Complete 'complete' => Complete
} }.

View File

@ -1,8 +1,8 @@
-module(swagger_pet). -module(swagger_pet).
-export_type([swagger_pet/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_pet/0]).
-type swagger_pet() :: -type swagger_pet() ::
#{ 'id' => integer(), #{ 'id' => integer(),
@ -26,4 +26,4 @@ encode(#{ 'id' := Id,
'photoUrls' => PhotoUrls, 'photoUrls' => PhotoUrls,
'tags' => Tags, 'tags' => Tags,
'status' => Status 'status' => Status
} }.

View File

@ -1,19 +1,23 @@
-module(swagger_pet_api). -module(swagger_pet_api).
-export([add_pet/1, -export([add_pet/1, add_pet/2,
delete_pet/2, delete_pet/1, delete_pet/2,
find_pets_by_status/1, find_pets_by_status/1, find_pets_by_status/2,
find_pets_by_tags/1, find_pets_by_tags/1, find_pets_by_tags/2,
get_pet_by_id/1, get_pet_by_id/1, get_pet_by_id/2,
update_pet/1, update_pet/1, update_pet/2,
update_pet_with_form/3, update_pet_with_form/1, update_pet_with_form/2,
upload_file/3]). upload_file/1, upload_file/2]).
-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). -define(BASE_URL, <<"http://petstore.swagger.io/v2">>).
%% @doc Add a new pet to the store %% @doc Add a new pet to the store
-spec add_pet(swagger_pet:swagger_pet()) -> ok | {error, integer()}. -spec add_pet(swagger_pet:swagger_pet(), term()) -> ok | {error, integer()}.
add_pet(Body) -> add_pet(Body) ->
add_pet(Body, Body, #{}).
-spec add_pet(swagger_pet:swagger_pet(), term(), maps:map()) -> ok | {error, integer()}.
add_pet(Body, Body, _Optional) ->
Method = post, Method = post,
Path = ["/pet"], Path = ["/pet"],
QS = [], QS = [],
@ -30,12 +34,16 @@ add_pet(Body) ->
end. end.
%% @doc Deletes a pet %% @doc Deletes a pet
-spec delete_pet(integer(), binary()) -> ok | {error, integer()}. -spec delete_pet(integer()) -> ok | {error, integer()}.
delete_pet(PetId, ApiKey) -> delete_pet(PetId) ->
delete_pet(PetId, , #{}).
-spec delete_pet(integer(), maps:map()) -> ok | {error, integer()}.
delete_pet(PetId, _Optional) ->
Method = delete, Method = delete,
Path = ["/pet/", PetId, ""], Path = ["/pet/", PetId, ""],
QS = [], QS = [],
Headers = [{<<"api_key">>, ApiKey}], Headers = []++[{X, maps:get(X, _Optional)} || X <- ['api_key'], maps:is_key(X, _Optional)],
Body1 = [], Body1 = [],
Opts = [], Opts = [],
Url = hackney_url:make_url(?BASE_URL, Path, QS), Url = hackney_url:make_url(?BASE_URL, Path, QS),
@ -51,9 +59,13 @@ delete_pet(PetId, ApiKey) ->
%% Multiple status values can be provided with comma separated strings %% Multiple status values can be provided with comma separated strings
-spec find_pets_by_status(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}. -spec find_pets_by_status(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}.
find_pets_by_status(Status) -> find_pets_by_status(Status) ->
find_pets_by_status(Status, , #{}).
-spec find_pets_by_status(list(), maps:map()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}.
find_pets_by_status(Status, _Optional) ->
Method = get, Method = get,
Path = ["/pet/findByStatus"], Path = ["/pet/findByStatus"],
QS = lists:flatten([[{<<"status">>, X} || X <- Status]]), QS = lists:flatten([[{<<"status">>, X} || X <- Status]])++[{X, maps:get(X, _Optional)} || X <- [], maps:is_key(X, _Optional)],
Headers = [], Headers = [],
Body1 = [], Body1 = [],
Opts = [], Opts = [],
@ -61,8 +73,8 @@ find_pets_by_status(Status) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid status value"} {error, "Invalid status value"}
end. end.
@ -71,9 +83,13 @@ find_pets_by_status(Status) ->
%% Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. %% Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
-spec find_pets_by_tags(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}. -spec find_pets_by_tags(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}.
find_pets_by_tags(Tags) -> find_pets_by_tags(Tags) ->
find_pets_by_tags(Tags, , #{}).
-spec find_pets_by_tags(list(), maps:map()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}.
find_pets_by_tags(Tags, _Optional) ->
Method = get, Method = get,
Path = ["/pet/findByTags"], Path = ["/pet/findByTags"],
QS = lists:flatten([[{<<"tags">>, X} || X <- Tags]]), QS = lists:flatten([[{<<"tags">>, X} || X <- Tags]])++[{X, maps:get(X, _Optional)} || X <- [], maps:is_key(X, _Optional)],
Headers = [], Headers = [],
Body1 = [], Body1 = [],
Opts = [], Opts = [],
@ -81,8 +97,8 @@ find_pets_by_tags(Tags) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid tag value"} {error, "Invalid tag value"}
end. end.
@ -91,6 +107,10 @@ find_pets_by_tags(Tags) ->
%% Returns a single pet %% Returns a single pet
-spec get_pet_by_id(integer()) -> {ok, list(), swagger_pet:swagger_pet()} | {error, string()}. -spec get_pet_by_id(integer()) -> {ok, list(), swagger_pet:swagger_pet()} | {error, string()}.
get_pet_by_id(PetId) -> get_pet_by_id(PetId) ->
get_pet_by_id(PetId, , #{}).
-spec get_pet_by_id(integer(), maps:map()) -> {ok, list(), swagger_pet:swagger_pet()} | {error, string()}.
get_pet_by_id(PetId, _Optional) ->
Method = get, Method = get,
Path = ["/pet/", PetId, ""], Path = ["/pet/", PetId, ""],
QS = [], QS = [],
@ -101,8 +121,8 @@ get_pet_by_id(PetId) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid ID supplied"}; {error, "Invalid ID supplied"};
{ok, 404, _RespHeaders, _ClientRef} -> {ok, 404, _RespHeaders, _ClientRef} ->
@ -110,8 +130,12 @@ get_pet_by_id(PetId) ->
end. end.
%% @doc Update an existing pet %% @doc Update an existing pet
-spec update_pet(swagger_pet:swagger_pet()) -> ok | {error, integer()}. -spec update_pet(swagger_pet:swagger_pet(), term()) -> ok | {error, integer()}.
update_pet(Body) -> update_pet(Body) ->
update_pet(Body, Body, #{}).
-spec update_pet(swagger_pet:swagger_pet(), term(), maps:map()) -> ok | {error, integer()}.
update_pet(Body, Body, _Optional) ->
Method = put, Method = put,
Path = ["/pet"], Path = ["/pet"],
QS = [], QS = [],
@ -128,13 +152,17 @@ update_pet(Body) ->
end. end.
%% @doc Updates a pet in the store with form data %% @doc Updates a pet in the store with form data
-spec update_pet_with_form(integer(), binary(), binary()) -> ok | {error, integer()}. -spec update_pet_with_form(integer()) -> ok | {error, integer()}.
update_pet_with_form(PetId, Name, Status) -> update_pet_with_form(PetId) ->
update_pet_with_form(PetId, , #{}).
-spec update_pet_with_form(integer(), maps:map()) -> ok | {error, integer()}.
update_pet_with_form(PetId, _Optional) ->
Method = post, Method = post,
Path = ["/pet/", PetId, ""], Path = ["/pet/", PetId, ""],
QS = [], QS = [],
Headers = [], Headers = [],
Body1 = {form, [{<<"name">>, Name}, {<<"status">>, Status}]}, Body1 = {form, []++[{X, maps:get(X, _Optional)} || X <- ['name', 'status'], maps:is_key(X, _Optional)]},
Opts = [], Opts = [],
Url = hackney_url:make_url(?BASE_URL, Path, QS), Url = hackney_url:make_url(?BASE_URL, Path, QS),
@ -146,20 +174,24 @@ update_pet_with_form(PetId, Name, Status) ->
end. end.
%% @doc uploads an image %% @doc uploads an image
-spec upload_file(integer(), binary(), binary()) -> {ok, list(), swagger_api_response:swagger_api_response()} | {error, string()}. -spec upload_file(integer()) -> {ok, list(), swagger_api_response:swagger_api_response()} | {error, string()}.
upload_file(PetId, AdditionalMetadata, File) -> upload_file(PetId) ->
upload_file(PetId, , #{}).
-spec upload_file(integer(), maps:map()) -> {ok, list(), swagger_api_response:swagger_api_response()} | {error, string()}.
upload_file(PetId, _Optional) ->
Method = post, Method = post,
Path = ["/pet/", PetId, "/uploadImage"], Path = ["/pet/", PetId, "/uploadImage"],
QS = [], QS = [],
Headers = [], Headers = [],
Body1 = {form, [{<<"additionalMetadata">>, AdditionalMetadata}, {<<"file">>, File}]}, Body1 = {form, []++[{X, maps:get(X, _Optional)} || X <- ['additionalMetadata', 'file'], maps:is_key(X, _Optional)]},
Opts = [], Opts = [],
Url = hackney_url:make_url(?BASE_URL, Path, QS), Url = hackney_url:make_url(?BASE_URL, Path, QS),
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])} {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])}
end. end.

View File

@ -1,9 +1,9 @@
-module(swagger_store_api). -module(swagger_store_api).
-export([delete_order/1, -export([delete_order/1, delete_order/2,
get_inventory/0, get_inventory/0, get_inventory/1,
get_order_by_id/1, get_order_by_id/1, get_order_by_id/2,
place_order/1]). place_order/1, place_order/2]).
-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). -define(BASE_URL, <<"http://petstore.swagger.io/v2">>).
@ -11,6 +11,10 @@
%% For valid response try integer IDs with value &lt; 1000. Anything above 1000 or nonintegers will generate API errors %% For valid response try integer IDs with value &lt; 1000. Anything above 1000 or nonintegers will generate API errors
-spec delete_order(binary()) -> ok | {error, integer()}. -spec delete_order(binary()) -> ok | {error, integer()}.
delete_order(OrderId) -> delete_order(OrderId) ->
delete_order(OrderId, , #{}).
-spec delete_order(binary(), maps:map()) -> ok | {error, integer()}.
delete_order(OrderId, _Optional) ->
Method = delete, Method = delete,
Path = ["/store/order/", OrderId, ""], Path = ["/store/order/", OrderId, ""],
QS = [], QS = [],
@ -30,6 +34,10 @@ delete_order(OrderId) ->
%% Returns a map of status codes to quantities %% Returns a map of status codes to quantities
-spec get_inventory() -> {ok, list(), maps:map()} | {error, string()}. -spec get_inventory() -> {ok, list(), maps:map()} | {error, string()}.
get_inventory() -> get_inventory() ->
get_inventory(, #{}).
-spec get_inventory(maps:map()) -> {ok, list(), maps:map()} | {error, string()}.
get_inventory(_Optional) ->
Method = get, Method = get,
Path = ["/store/inventory"], Path = ["/store/inventory"],
QS = [], QS = [],
@ -40,14 +48,18 @@ get_inventory() ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])} {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])}
end. end.
%% @doc Find purchase order by ID %% @doc Find purchase order by ID
%% For valid response try integer IDs with value &lt;&#x3D; 5 or &gt; 10. Other values will generated exceptions %% For valid response try integer IDs with value &lt;&#x3D; 5 or &gt; 10. Other values will generated exceptions
-spec get_order_by_id(integer()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}. -spec get_order_by_id(integer()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}.
get_order_by_id(OrderId) -> get_order_by_id(OrderId) ->
get_order_by_id(OrderId, , #{}).
-spec get_order_by_id(integer(), maps:map()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}.
get_order_by_id(OrderId, _Optional) ->
Method = get, Method = get,
Path = ["/store/order/", OrderId, ""], Path = ["/store/order/", OrderId, ""],
QS = [], QS = [],
@ -58,8 +70,8 @@ get_order_by_id(OrderId) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid ID supplied"}; {error, "Invalid ID supplied"};
{ok, 404, _RespHeaders, _ClientRef} -> {ok, 404, _RespHeaders, _ClientRef} ->
@ -67,8 +79,12 @@ get_order_by_id(OrderId) ->
end. end.
%% @doc Place an order for a pet %% @doc Place an order for a pet
-spec place_order(swagger_order:swagger_order()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}. -spec place_order(swagger_order:swagger_order(), term()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}.
place_order(Body) -> place_order(Body) ->
place_order(Body, Body, #{}).
-spec place_order(swagger_order:swagger_order(), term(), maps:map()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}.
place_order(Body, Body, _Optional) ->
Method = post, Method = post,
Path = ["/store/order"], Path = ["/store/order"],
QS = [], QS = [],
@ -79,8 +95,8 @@ place_order(Body) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid Order"} {error, "Invalid Order"}
end. end.

View File

@ -1,8 +1,8 @@
-module(swagger_tag). -module(swagger_tag).
-export_type([swagger_tag/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_tag/0]).
-type swagger_tag() :: -type swagger_tag() ::
#{ 'id' => integer(), #{ 'id' => integer(),
@ -14,4 +14,4 @@ encode(#{ 'id' := Id,
}) -> }) ->
#{ 'id' => Id, #{ 'id' => Id,
'name' => Name 'name' => Name
} }.

View File

@ -1,8 +1,8 @@
-module(swagger_user). -module(swagger_user).
-export_type([swagger_user/0, -export([encode/1]).
encode/1,
decode/1]). -export_type([swagger_user/0]).
-type swagger_user() :: -type swagger_user() ::
#{ 'id' => integer(), #{ 'id' => integer(),
@ -32,4 +32,4 @@ encode(#{ 'id' := Id,
'password' => Password, 'password' => Password,
'phone' => Phone, 'phone' => Phone,
'userStatus' => UserStatus 'userStatus' => UserStatus
} }.

View File

@ -1,20 +1,24 @@
-module(swagger_user_api). -module(swagger_user_api).
-export([create_user/1, -export([create_user/1, create_user/2,
create_users_with_array_input/1, create_users_with_array_input/1, create_users_with_array_input/2,
create_users_with_list_input/1, create_users_with_list_input/1, create_users_with_list_input/2,
delete_user/1, delete_user/1, delete_user/2,
get_user_by_name/1, get_user_by_name/1, get_user_by_name/2,
login_user/2, login_user/2, login_user/3,
logout_user/0, logout_user/0, logout_user/1,
update_user/2]). update_user/2, update_user/3]).
-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). -define(BASE_URL, <<"http://petstore.swagger.io/v2">>).
%% @doc Create user %% @doc Create user
%% This can only be done by the logged in user. %% This can only be done by the logged in user.
-spec create_user(swagger_user:swagger_user()) -> ok | {error, integer()}. -spec create_user(swagger_user:swagger_user(), term()) -> ok | {error, integer()}.
create_user(Body) -> create_user(Body) ->
create_user(Body, Body, #{}).
-spec create_user(swagger_user:swagger_user(), term(), maps:map()) -> ok | {error, integer()}.
create_user(Body, Body, _Optional) ->
Method = post, Method = post,
Path = ["/user"], Path = ["/user"],
QS = [], QS = [],
@ -31,8 +35,12 @@ create_user(Body) ->
end. end.
%% @doc Creates list of users with given input array %% @doc Creates list of users with given input array
-spec create_users_with_array_input(list()) -> ok | {error, integer()}. -spec create_users_with_array_input(list(), term()) -> ok | {error, integer()}.
create_users_with_array_input(Body) -> create_users_with_array_input(Body) ->
create_users_with_array_input(Body, Body, #{}).
-spec create_users_with_array_input(list(), term(), maps:map()) -> ok | {error, integer()}.
create_users_with_array_input(Body, Body, _Optional) ->
Method = post, Method = post,
Path = ["/user/createWithArray"], Path = ["/user/createWithArray"],
QS = [], QS = [],
@ -49,8 +57,12 @@ create_users_with_array_input(Body) ->
end. end.
%% @doc Creates list of users with given input array %% @doc Creates list of users with given input array
-spec create_users_with_list_input(list()) -> ok | {error, integer()}. -spec create_users_with_list_input(list(), term()) -> ok | {error, integer()}.
create_users_with_list_input(Body) -> create_users_with_list_input(Body) ->
create_users_with_list_input(Body, Body, #{}).
-spec create_users_with_list_input(list(), term(), maps:map()) -> ok | {error, integer()}.
create_users_with_list_input(Body, Body, _Optional) ->
Method = post, Method = post,
Path = ["/user/createWithList"], Path = ["/user/createWithList"],
QS = [], QS = [],
@ -70,6 +82,10 @@ create_users_with_list_input(Body) ->
%% This can only be done by the logged in user. %% This can only be done by the logged in user.
-spec delete_user(binary()) -> ok | {error, integer()}. -spec delete_user(binary()) -> ok | {error, integer()}.
delete_user(Username) -> delete_user(Username) ->
delete_user(Username, , #{}).
-spec delete_user(binary(), maps:map()) -> ok | {error, integer()}.
delete_user(Username, _Optional) ->
Method = delete, Method = delete,
Path = ["/user/", Username, ""], Path = ["/user/", Username, ""],
QS = [], QS = [],
@ -88,6 +104,10 @@ delete_user(Username) ->
%% @doc Get user by user name %% @doc Get user by user name
-spec get_user_by_name(binary()) -> {ok, list(), swagger_user:swagger_user()} | {error, string()}. -spec get_user_by_name(binary()) -> {ok, list(), swagger_user:swagger_user()} | {error, string()}.
get_user_by_name(Username) -> get_user_by_name(Username) ->
get_user_by_name(Username, , #{}).
-spec get_user_by_name(binary(), maps:map()) -> {ok, list(), swagger_user:swagger_user()} | {error, string()}.
get_user_by_name(Username, _Optional) ->
Method = get, Method = get,
Path = ["/user/", Username, ""], Path = ["/user/", Username, ""],
QS = [], QS = [],
@ -98,8 +118,8 @@ get_user_by_name(Username) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid username supplied"}; {error, "Invalid username supplied"};
{ok, 404, _RespHeaders, _ClientRef} -> {ok, 404, _RespHeaders, _ClientRef} ->
@ -109,9 +129,13 @@ get_user_by_name(Username) ->
%% @doc Logs user into the system %% @doc Logs user into the system
-spec login_user(binary(), binary()) -> {ok, list(), binary()} | {error, string()}. -spec login_user(binary(), binary()) -> {ok, list(), binary()} | {error, string()}.
login_user(Username, Password) -> login_user(Username, Password) ->
login_user(Username, Password, , #{}).
-spec login_user(binary(), binary(), maps:map()) -> {ok, list(), binary()} | {error, string()}.
login_user(Username, Password, _Optional) ->
Method = get, Method = get,
Path = ["/user/login"], Path = ["/user/login"],
QS = lists:flatten([{<<"username">>, Username}, {<<"password">>, Password}]), QS = lists:flatten([{<<"username">>, Username}, {<<"password">>, Password}])++[{X, maps:get(X, _Optional)} || X <- [], maps:is_key(X, _Optional)],
Headers = [], Headers = [],
Body1 = [], Body1 = [],
Opts = [], Opts = [],
@ -119,8 +143,8 @@ login_user(Username, Password) ->
case hackney:request(Method, Url, Headers, Body1, Opts) of case hackney:request(Method, Url, Headers, Body1, Opts) of
{ok, 200, RespHeaders, ClientRef} -> {ok, 200, RespHeaders, ClientRef} ->
{ok, Body} = hackney:body(ClientRef), {ok, ResponseBody} = hackney:body(ClientRef),
{ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; {ok, RespHeaders, jsx:decode(ResponseBody, [return_maps])};
{ok, 400, _RespHeaders, _ClientRef} -> {ok, 400, _RespHeaders, _ClientRef} ->
{error, "Invalid username/password supplied"} {error, "Invalid username/password supplied"}
end. end.
@ -128,6 +152,10 @@ login_user(Username, Password) ->
%% @doc Logs out current logged in user session %% @doc Logs out current logged in user session
-spec logout_user() -> ok | {error, integer()}. -spec logout_user() -> ok | {error, integer()}.
logout_user() -> logout_user() ->
logout_user(, #{}).
-spec logout_user(maps:map()) -> ok | {error, integer()}.
logout_user(_Optional) ->
Method = get, Method = get,
Path = ["/user/logout"], Path = ["/user/logout"],
QS = [], QS = [],
@ -145,8 +173,12 @@ logout_user() ->
%% @doc Updated user %% @doc Updated user
%% This can only be done by the logged in user. %% This can only be done by the logged in user.
-spec update_user(binary(), swagger_user:swagger_user()) -> ok | {error, integer()}. -spec update_user(binary(), swagger_user:swagger_user(), term()) -> ok | {error, integer()}.
update_user(Username, Body) -> update_user(Username, Body) ->
update_user(Username, Body, Body, #{}).
-spec update_user(binary(), swagger_user:swagger_user(), term(), maps:map()) -> ok | {error, integer()}.
update_user(Username, Body, Body, _Optional) ->
Method = put, Method = put,
Path = ["/user/", Username, ""], Path = ["/user/", Username, ""],
QS = [], QS = [],