[Elixir] Fixes Typespec for multiple return definitions (#7604)

* Respects multiple responses during typespec generation

* Generate Samples
This commit is contained in:
Michael Ramstein
2020-10-10 05:18:04 +02:00
committed by GitHub
parent 53fb864c66
commit 242f648379
4 changed files with 43 additions and 32 deletions

View File

@@ -727,34 +727,45 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig
}
}
sb.append("keyword()) :: {:ok, ");
if (returnBaseType == null) {
sb.append("nil");
} else if (returnSimpleType) {
if (!returnTypeIsPrimitive) {
sb.append(moduleName);
sb.append(".Model.");
}
sb.append(returnBaseType);
sb.append(".t");
} else if (returnContainer == null) {
sb.append(returnBaseType);
sb.append(".t");
} else {
if (returnContainer.equals("array") ||
returnContainer.equals("set")) {
sb.append("list(");
if (!returnTypeIsPrimitive) {
sb.append(moduleName);
sb.append(".Model.");
sb.append("keyword()) :: ");
HashSet<String> uniqueResponseTypes = new HashSet<String>();
for (CodegenResponse response : this.responses) {
ExtendedCodegenResponse exResponse = (ExtendedCodegenResponse) response;
StringBuilder returnEntry = new StringBuilder("");
if (exResponse.baseType == null) {
returnEntry.append("nil");
} else if (exResponse.simpleType) {
if (!exResponse.primitiveType) {
returnEntry.append(moduleName);
returnEntry.append(".Model.");
}
returnEntry.append(exResponse.baseType);
returnEntry.append(".t");
} else if (exResponse.containerType == null) {
returnEntry.append(returnBaseType);
returnEntry.append(".t");
} else {
if (exResponse.containerType.equals("array") ||
exResponse.containerType.equals("set")) {
returnEntry.append("list(");
if (!exResponse.primitiveType) {
returnEntry.append(moduleName);
returnEntry.append(".Model.");
}
returnEntry.append(exResponse.baseType);
returnEntry.append(".t)");
} else if (exResponse.containerType.equals("map")) {
returnEntry.append("map()");
}
sb.append(returnBaseType);
sb.append(".t)");
} else if (returnContainer.equals("map")) {
sb.append("map()");
}
uniqueResponseTypes.add(returnEntry.toString());
}
sb.append("} | {:error, Tesla.Env.t}");
for (String returnType : uniqueResponseTypes) {
sb.append("{:ok, ").append(returnType).append("} | ");
}
sb.append("{:error, Tesla.Env.t}");
return sb.toString();
}

View File

@@ -83,7 +83,7 @@ defmodule OpenapiPetstore.Api.Pet do
{:ok, [%Pet{}, ...]} on success
{:error, info} on failure
"""
@spec find_pets_by_status(Tesla.Env.client, list(String.t), keyword()) :: {:ok, list(OpenapiPetstore.Model.Pet.t)} | {:error, Tesla.Env.t}
@spec find_pets_by_status(Tesla.Env.client, list(String.t), keyword()) :: {:ok, nil} | {:ok, list(OpenapiPetstore.Model.Pet.t)} | {:error, Tesla.Env.t}
def find_pets_by_status(connection, status, _opts \\ []) do
%{}
|> method(:get)
@@ -111,7 +111,7 @@ defmodule OpenapiPetstore.Api.Pet do
{:ok, [%Pet{}, ...]} on success
{:error, info} on failure
"""
@spec find_pets_by_tags(Tesla.Env.client, list(String.t), keyword()) :: {:ok, list(OpenapiPetstore.Model.Pet.t)} | {:error, Tesla.Env.t}
@spec find_pets_by_tags(Tesla.Env.client, list(String.t), keyword()) :: {:ok, nil} | {:ok, list(OpenapiPetstore.Model.Pet.t)} | {:error, Tesla.Env.t}
def find_pets_by_tags(connection, tags, _opts \\ []) do
%{}
|> method(:get)
@@ -139,7 +139,7 @@ defmodule OpenapiPetstore.Api.Pet do
{:ok, %OpenapiPetstore.Model.Pet{}} on success
{:error, info} on failure
"""
@spec get_pet_by_id(Tesla.Env.client, integer(), keyword()) :: {:ok, OpenapiPetstore.Model.Pet.t} | {:error, Tesla.Env.t}
@spec get_pet_by_id(Tesla.Env.client, integer(), keyword()) :: {:ok, nil} | {:ok, OpenapiPetstore.Model.Pet.t} | {:error, Tesla.Env.t}
def get_pet_by_id(connection, pet_id, _opts \\ []) do
%{}
|> method(:get)

View File

@@ -77,7 +77,7 @@ defmodule OpenapiPetstore.Api.Store do
{:ok, %OpenapiPetstore.Model.Order{}} on success
{:error, info} on failure
"""
@spec get_order_by_id(Tesla.Env.client, integer(), keyword()) :: {:ok, OpenapiPetstore.Model.Order.t} | {:error, Tesla.Env.t}
@spec get_order_by_id(Tesla.Env.client, integer(), keyword()) :: {:ok, nil} | {:ok, OpenapiPetstore.Model.Order.t} | {:error, Tesla.Env.t}
def get_order_by_id(connection, order_id, _opts \\ []) do
%{}
|> method(:get)
@@ -104,7 +104,7 @@ defmodule OpenapiPetstore.Api.Store do
{:ok, %OpenapiPetstore.Model.Order{}} on success
{:error, info} on failure
"""
@spec place_order(Tesla.Env.client, OpenapiPetstore.Model.Order.t, keyword()) :: {:ok, OpenapiPetstore.Model.Order.t} | {:error, Tesla.Env.t}
@spec place_order(Tesla.Env.client, OpenapiPetstore.Model.Order.t, keyword()) :: {:ok, nil} | {:ok, OpenapiPetstore.Model.Order.t} | {:error, Tesla.Env.t}
def place_order(connection, body, _opts \\ []) do
%{}
|> method(:post)

View File

@@ -130,7 +130,7 @@ defmodule OpenapiPetstore.Api.User do
{:ok, %OpenapiPetstore.Model.User{}} on success
{:error, info} on failure
"""
@spec get_user_by_name(Tesla.Env.client, String.t, keyword()) :: {:ok, OpenapiPetstore.Model.User.t} | {:error, Tesla.Env.t}
@spec get_user_by_name(Tesla.Env.client, String.t, keyword()) :: {:ok, nil} | {:ok, OpenapiPetstore.Model.User.t} | {:error, Tesla.Env.t}
def get_user_by_name(connection, username, _opts \\ []) do
%{}
|> method(:get)
@@ -158,7 +158,7 @@ defmodule OpenapiPetstore.Api.User do
{:ok, %OpenapiPetstore.Model.String.t{}} on success
{:error, info} on failure
"""
@spec login_user(Tesla.Env.client, String.t, String.t, keyword()) :: {:ok, String.t} | {:error, Tesla.Env.t}
@spec login_user(Tesla.Env.client, String.t, String.t, keyword()) :: {:ok, nil} | {:ok, String.t} | {:error, Tesla.Env.t}
def login_user(connection, username, password, _opts \\ []) do
%{}
|> method(:get)