Description
The generator fails in case the openapi file describes an Array of Strings whereas, if I insert a stair of object between Array and String, the generated code is correct.
The compilation error looks like :
g++ -c -I./api -I./model -I./impl -Wall -g -std=c++11 -o obj/model/UeContext.o model/UeContext.cpp
model/UeContext.cpp: In member function ‘virtual void com::bcom::amf::microservice::server::ms1::model::UeContext::fromJson(nlohmann::json&)’:
model/UeContext.cpp:77:25: error: ‘std::__cxx11::string {aka class std::__cxx11::basic_string<char>}’ has no member named ‘fromJson’
newItem.fromJson(item);
^
../rules.mk:61: recipe for target 'obj/model/UeContext.o' failed
It is a well known error already fixed in some others conditions. See suggest below.
NOTE1: As previously wrote, if I insert a stair between Array and String, the string type is well handled.
NOTE2: Switch between the two UeContext type I wrote inside the openapi.yaml example to reproduce the error and the correct behavior.
openapi-generator version
Current master 3.3.2-SNAPSHOT got the issue but I also used the PR #1230 to take advantage of the fix #1168
OpenAPI declaration file content or url
openapi: 3.0.0
info:
version: 1.0.0
title: Check generation of array of object (Pistache)
description: Internal ref filename is check_array_of_strings.yaml
servers:
- url: http://localhost:8080
paths:
/stair1:
post:
summary: blabla
operationId: check_generation
tags:
- Stair1
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UeContext'
required: true
responses:
'200':
description: Expected response to a valid request
content:
application/json:
schema:
type: string
default:
description: Unexpected error
components:
schemas:
# Fail
UeContext:
type: object
properties:
groups:
type: array
items:
$ref: '#/components/schemas/GroupId'
minItems: 0
# Success
# UeContext:
# type: object
# properties:
# groups:
# type: array
# items:
# $ref: '#/components/schemas/ObjectId'
# minItems: 0
ObjectId:
type: object
properties:
events:
$ref: '#/components/schemas/GroupId'
GroupId:
type: string
Command line used for generation
Generate :
openapi-generator-cli.sh generate -i ./openapi.yaml -g cpp-pistache-server -c ./config.json -o .
Compile :
g++ -c -I./api -I./model -I./impl -Wall -g -std=c++11 -o obj/model/UeContext.o model/UeContext.cpp
Steps to reproduce
Generate & compile
Related issues/PRs
Suggest a fix/enhancement
Generated code looks like below. I inserted a #ifdef to explain which code should be generated, but I'm sure @etherealjoy already know what should be done ;)
void UeContext::fromJson(nlohmann::json& val)
{
{
m_Groups.clear();
nlohmann::json jsonArray;
if(val.find("groups") != val.end())
{
for( auto& item : val["groups"] )
{
if(item.is_null())
{
m_Groups.push_back( std::string() );
}
else
{
std::string newItem;
#ifdef CURRENT_GENERATION
// This is the current code generation
newItem.fromJson(item);
#else
// This is what should be generated
newItem = ModelBase::fromJson(item);
#endif
m_Groups.push_back( newItem );
}
}
}
}
}
Description
The generator fails in case the openapi file describes an Array of Strings whereas, if I insert a stair of object between Array and String, the generated code is correct.
The compilation error looks like :
It is a well known error already fixed in some others conditions. See suggest below.
NOTE1: As previously wrote, if I insert a stair between Array and String, the string type is well handled.
NOTE2: Switch between the two UeContext type I wrote inside the openapi.yaml example to reproduce the error and the correct behavior.
openapi-generator version
Current master 3.3.2-SNAPSHOT got the issue but I also used the PR #1230 to take advantage of the fix #1168
OpenAPI declaration file content or url
Command line used for generation
Generate :
Compile :
Steps to reproduce
Generate & compile
Related issues/PRs
Suggest a fix/enhancement
Generated code looks like below. I inserted a #ifdef to explain which code should be generated, but I'm sure @etherealjoy already know what should be done ;)