Skip to content

Commit bfce96b

Browse files
committed
add support for oneOf
relates to #6378
1 parent acb80ba commit bfce96b

4 files changed

Lines changed: 218 additions & 3 deletions

File tree

modules/openapi-generator/src/main/resources/cpp-qt-client/model-body.mustache

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
{{>licenseInfo}}{{#models}}{{#model}}
1+
{{>licenseInfo}}{{#models}}{{#model}}{{#discriminator}}{{>model-oneof-body}}{{/discriminator}}{{^discriminator}}
22
#include "{{classname}}.h"
33

44
#include <QDebug>
55
#include <QJsonArray>
66
#include <QJsonDocument>
77
#include <QObject>
8+
#include <QJsonValue>
89

910
#include "{{prefix}}Helpers.h"
1011

@@ -160,5 +161,5 @@ bool {{classname}}::isValid() const {
160161
{{#cppNamespaceDeclarations}}
161162
} // namespace {{this}}
162163
{{/cppNamespaceDeclarations}}
163-
{{/model}}
164+
{{/discriminator}}{{/model}}
164165
{{/models}}

modules/openapi-generator/src/main/resources/cpp-qt-client/model-header.mustache

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{{>licenseInfo}}
2-
{{#models}}{{#model}}/*
2+
{{#models}}{{#model}}{{#discriminator}}{{>model-oneof}}{{/discriminator}}{{^discriminator}}/*
33
* {{classname}}.h
44
*
55
* {{description}}
@@ -10,6 +10,7 @@
1010

1111
#include <QJsonObject>
1212

13+
{{/discriminator}}
1314
{{/model}}{{/models}}{{#imports}}{{{import}}}
1415
{{/imports}}
1516

@@ -18,6 +19,7 @@
1819

1920
{{#models}}
2021
{{#model}}
22+
{{^discriminator}}
2123
{{#cppNamespaceDeclarations}}
2224
namespace {{this}} {
2325
{{/cppNamespaceDeclarations}}
@@ -76,5 +78,6 @@ private:
7678
Q_DECLARE_METATYPE({{#cppNamespaceDeclarations}}{{this}}::{{/cppNamespaceDeclarations}}{{classname}})
7779

7880
#endif // {{classname}}_H
81+
{{/discriminator}}
7982
{{/model}}
8083
{{/models}}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#include "{{classname}}.h"
2+
3+
#include <QDebug>
4+
#include <QJsonArray>
5+
#include <QJsonDocument>
6+
#include <QObject>
7+
#include <QJsonValue>
8+
#include <variant>
9+
#include <memory>
10+
11+
{{#discriminator}}
12+
{{#mappedModels}}
13+
#include "{{modelName}}.h"
14+
{{/mappedModels}}
15+
{{/discriminator}}
16+
17+
{{#cppNamespaceDeclarations}}
18+
namespace {{this}} {
19+
{{/cppNamespaceDeclarations}}
20+
21+
{{classname}}::{{classname}}() {
22+
this->initializeModel();
23+
}
24+
25+
{{classname}}::{{classname}}(QString json) {
26+
this->initializeModel();
27+
this->fromJson(json);
28+
}
29+
30+
{{classname}}::~{{classname}}() {}
31+
32+
void {{classname}}::initializeModel() {
33+
m_actualInstance = std::monostate{};
34+
m_discriminatorValue = QString();
35+
}
36+
37+
void {{classname}}::fromJson(QString jsonString) {
38+
QByteArray array(jsonString.toStdString().c_str());
39+
QJsonDocument doc = QJsonDocument::fromJson(array);
40+
QJsonObject jsonObject = doc.object();
41+
this->fromJsonObject(jsonObject);
42+
}
43+
44+
void {{classname}}::fromJsonObject(QJsonObject json) {
45+
{{#discriminator}}
46+
m_discriminatorValue = json["{{propertyName}}"].toString();
47+
{{/discriminator}}
48+
49+
{{#discriminator}}
50+
{{#mappedModels}}
51+
if (m_discriminatorValue == "{{mappingName}}") {
52+
auto instance = std::make_shared<{{modelName}}>();
53+
instance->fromJsonObject(json);
54+
m_actualInstance = instance;
55+
return;
56+
}
57+
{{/mappedModels}}
58+
{{/discriminator}}
59+
60+
qWarning() << "{{classname}}: Unknown discriminator value '" << m_discriminatorValue << "'";
61+
}
62+
63+
QString {{classname}}::asJson() const {
64+
return std::visit([](const auto& value) -> QString {
65+
using T = std::decay_t<decltype(value)>;
66+
if constexpr (std::is_same_v<T, std::monostate>) {
67+
return QString();
68+
} else {
69+
return value->asJson();
70+
}
71+
}, m_actualInstance);
72+
}
73+
74+
QJsonObject {{classname}}::asJsonObject() const {
75+
return std::visit([this](const auto& value) -> QJsonObject {
76+
using T = std::decay_t<decltype(value)>;
77+
if constexpr (std::is_same_v<T, std::monostate>) {
78+
return QJsonObject();
79+
} else {
80+
QJsonObject obj = value->asJsonObject();
81+
{{#discriminator}}
82+
if (!m_discriminatorValue.isEmpty()) {
83+
obj.insert(QString("{{propertyName}}"), QJsonValue(m_discriminatorValue));
84+
}
85+
{{/discriminator}}
86+
return obj;
87+
}
88+
}, m_actualInstance);
89+
}
90+
91+
bool {{classname}}::isSet() const {
92+
return !std::holds_alternative<std::monostate>(m_actualInstance) && !m_discriminatorValue.isEmpty();
93+
}
94+
95+
96+
bool {{classname}}::isValid() const {
97+
return std::visit([](const auto& value) -> bool {
98+
using T = std::decay_t<decltype(value)>;
99+
if constexpr (std::is_same_v<T, std::monostate>) {
100+
return false;
101+
} else {
102+
return value->isValid();
103+
}
104+
}, m_actualInstance);
105+
}
106+
107+
void {{classname}}::setValue(const {{classname}}::VariantType &value) {
108+
m_actualInstance = value;
109+
110+
// Determine discriminator value by visiting the variant
111+
std::visit([this](const auto& v) {
112+
using T = std::decay_t<decltype(v)>;
113+
if constexpr (std::is_same_v<T, std::monostate>) {
114+
m_discriminatorValue = QString();
115+
} else {
116+
{{#discriminator}}
117+
{{#mappedModels}}
118+
if constexpr (std::is_same_v<T, std::shared_ptr<{{modelName}}>>) {
119+
m_discriminatorValue = "{{mappingName}}";
120+
}
121+
{{/mappedModels}}
122+
{{/discriminator}}
123+
}
124+
}, value);
125+
}
126+
127+
{{#discriminator}}
128+
{{#mappedModels}}
129+
bool {{classname}}::is{{modelName}}() const {
130+
return std::holds_alternative<std::shared_ptr<{{modelName}}>>(m_actualInstance);
131+
}
132+
133+
std::shared_ptr<{{modelName}}> {{classname}}::as{{modelName}}() const {
134+
auto ptr = std::get_if<std::shared_ptr<{{modelName}}>>(const_cast<VariantType *>(&m_actualInstance));
135+
return ptr ? *ptr : nullptr;
136+
}
137+
{{/mappedModels}}
138+
{{/discriminator}}
139+
140+
{{#cppNamespaceDeclarations}}
141+
} // namespace {{this}}
142+
{{/cppNamespaceDeclarations}}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* {{classname}}.h - OneOf Model
3+
*
4+
* {{description}}
5+
*/
6+
7+
#ifndef {{classname}}_H
8+
#define {{classname}}_H
9+
10+
#include <QJsonObject>
11+
#include <QJsonValue>
12+
#include <memory>
13+
#include <QString>
14+
#include <variant>
15+
16+
#include "{{prefix}}Enum.h"
17+
#include "{{prefix}}Object.h"
18+
19+
{{#cppNamespaceDeclarations}}
20+
namespace {{this}} {
21+
{{/cppNamespaceDeclarations}}
22+
23+
{{#discriminator}}
24+
{{#mappedModels}}
25+
class {{modelName}};
26+
{{/mappedModels}}
27+
{{/discriminator}}
28+
29+
class {{classname}} : public {{prefix}}Object {
30+
public:
31+
{{classname}}();
32+
explicit {{classname}}(QString json);
33+
~{{classname}}() override;
34+
35+
QString asJson() const override;
36+
QJsonObject asJsonObject() const override;
37+
void fromJsonObject(QJsonObject json) override;
38+
void fromJson(QString jsonString) override;
39+
40+
virtual bool isSet() const override;
41+
virtual bool isValid() const override;
42+
43+
{{#discriminator}}
44+
typedef std::variant<std::monostate{{#mappedModels}}, std::shared_ptr<{{modelName}}>{{/mappedModels}}> VariantType;
45+
void setValue(const VariantType &value);
46+
{{/discriminator}}
47+
48+
{{#discriminator}}
49+
{{#mappedModels}}
50+
bool is{{modelName}}() const;
51+
std::shared_ptr<{{modelName}}> as{{modelName}}() const;
52+
{{/mappedModels}}
53+
{{/discriminator}}
54+
55+
private:
56+
void initializeModel();
57+
{{#discriminator}}
58+
VariantType m_actualInstance;
59+
{{/discriminator}}
60+
QString m_discriminatorValue;
61+
};
62+
63+
{{#cppNamespaceDeclarations}}
64+
} // namespace {{this}}
65+
{{/cppNamespaceDeclarations}}
66+
67+
Q_DECLARE_METATYPE({{#cppNamespaceDeclarations}}{{this}}::{{/cppNamespaceDeclarations}}{{classname}})
68+
69+
#endif // {{classname}}_H

0 commit comments

Comments
 (0)