-
-
Notifications
You must be signed in to change notification settings - Fork 6.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[C++][Pistache] Simplified model template #3417
[C++][Pistache] Simplified model template #3417
Conversation
ce63ce7
to
8dc01a3
Compare
Here we would have a problem for native types for example we serialize everything even if not set, e.g. int being zero, string being "", default or uninitialized values Additionally this is a breaking change for all existing code. |
You're right. Anyways, I'd change three things in current model:
What do you think about it? |
Additionally, we may think about something resembling: template <typename... Args>
MyResponse::MyResponse(Args... args); and if e.g. MyResponse had 5 fields and a user gave only 3, then in return the first three would be set, the rest would not.
|
@muttleyxd @kuzkry
For objects with lots of members, which is fairly common in REST, it is not intuitive, and default values cannot help when the members of interest are not in order
This is a good idea
You could take a look at the other C++ generators for a hint, Qt5 client/server generator for example. In general, please keep in mind drastic changes which involves rework of user code are to be kept as less as possible. Inside the classes is not a problem, just we have to be careful what the user code will access. |
8dc01a3
to
384e0e4
Compare
Closing & Reopening to retrigger CI |
I've updated PR, now it targets 5.0.x branch, as it contains breaking changes.
|
@muttleyxd |
@etherealjoy
and when 5.x arrives, we'd swap them around? Fine by me, if that's what you meant, since I'm not sure what are your intentions with |
We can make yours as the default in 5.x release but my guess is that there will be developers who prefer the current implementation so we need to keep it as an option. For models in other generators (e.g. C#, Java), there are various options to customize the model so as to meet different requirement/preference. |
afc7fe7
to
4d68895
Compare
4d68895
to
59efd29
Compare
Thank you for your tips. Some changes to models & Java code. Please check if they're ok (I don't usually write Java, so I might have done something wrong). So now model consists of:
The last two methods are required for nlohmann::json.get_to() method to work, hence they are not members of model. Calling @etherealjoy since I've done changes I wanted. |
Interesting, It looks fine for me. |
CMake would fail with addExternalLibs set to false since it'd try to add depenency to not-existing targets
59efd29
to
10690f5
Compare
I've updated the PR, I removed some unnecessary code from to_json and from_json methods (as we don't need specific code for model members).
You can play around with UnsettableVector (name comes from old & fixed bug in Pistache's generator), it's a nice and short showcase (well, it lacks required arguments) openapi: 3.0.0
info:
description: Some description
version: 0.0.1
title: Some title
tags:
- name: hello
paths:
"/there":
get:
operationId: helloThereGet
tags:
- hello
summary: Do something
responses:
200:
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UnsettableVector"
post:
requestBody:
description: json to deserialize then serialize
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/UnsettableVector"
operationId: helloTherePost
tags:
- hello
summary: Do something (receive)
responses:
200:
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/UnsettableVector"
servers:
- url: http://localhost:8080
components:
schemas:
UnsettableVector:
type: object
properties:
someints:
type: array
items:
type: integer
member:
$ref: '#/components/schemas/VectorMember'
strmem:
type: string
VectorMember:
type: object
properties:
number:
type: integer
text:
type: string handlers ( void HelloApiImpl::hello_there_get(Pistache::Http::ResponseWriter &response) {
UnsettableVector vec
{
Pistache::Some(std::vector<int32_t>{1, 2, 3}),
Pistache::Some(VectorMember
{
Pistache::Some(123),
Pistache::None()
}),
Pistache::Some(std::string("hello there"))
};
response.send(Pistache::Http::Code::Ok, vec.to_json().dump());
}
void HelloApiImpl::hello_there_post(const UnsettableVector &unsettableVector, Pistache::Http::ResponseWriter &response) {
response.send(Pistache::Http::Code::Ok, unsettableVector.to_json().dump());
}
it nicely outputs and parses incoming UnsettableVector. |
This new change is very interesting. Makes it a lot simpler when handling objects. |
@etherealjoy |
* master: (207 commits) Add missing enum processing in C++ codegen, already present for Qt5 (#3986) [C++] [Pistache] Removed deprecated warnings (#3985) [C++][Pistache] Simplified model template (#3417) add go oas3 petstore to ensure up-to-date (#3979) replace gitter with slack in the doc (#3977) Fix wrong variable name in LessThan and LessThanOrEqual asserts (#3971) #3957 - Removed hardcoded baseUrl (#3964) Regenerate go openapi3 samples (#3975) [rust] Make it easier to test rust client generator (#3543) Fix issue3635 (#3948) add gradle repository (#3867) [java] allow to use setArtifactVersion() programmatically (#3907) Add a link to DevRelCon SF 2019 (#3961) Add a link to a medium blog post (#3960) update maven-compiler-plugin version (#3956) fix generateAliasAsModels in default generator (#3951) Implement BigDecimal to Decimal in swift4 for currency data as type=string format=number (#3910) Add F# Functions server generator (#3933) [python-experimental] generate model if type != object if enums/validations exist (#2757) [scala] add [date-time] field to codegen unit test (#3939) ...
* [C++][Pistache] Simplified model template * [C++][Pistache] Fix for addExternalLibs option CMake would fail with addExternalLibs set to false since it'd try to add depenency to not-existing targets * [C++][Pistache] Update cpp-pistache-server-petstore.sh * [C++][Pistache] Update Petstore sample * [C++][Pistache] Update documentation
* master: (110 commits) [golang] Regenerate all go samples (#3988) Better tests for string (number) (#3953) Add missing enum processing in C++ codegen, already present for Qt5 (#3986) [C++] [Pistache] Removed deprecated warnings (#3985) [C++][Pistache] Simplified model template (#3417) add go oas3 petstore to ensure up-to-date (#3979) replace gitter with slack in the doc (#3977) Fix wrong variable name in LessThan and LessThanOrEqual asserts (#3971) #3957 - Removed hardcoded baseUrl (#3964) Regenerate go openapi3 samples (#3975) [rust] Make it easier to test rust client generator (#3543) Fix issue3635 (#3948) add gradle repository (#3867) [java] allow to use setArtifactVersion() programmatically (#3907) Add a link to DevRelCon SF 2019 (#3961) Add a link to a medium blog post (#3960) update maven-compiler-plugin version (#3956) fix generateAliasAsModels in default generator (#3951) Implement BigDecimal to Decimal in swift4 for currency data as type=string format=number (#3910) Add F# Functions server generator (#3933) ...
@muttleyxd thanks for the PR, which has been included in the v4.1.3 release: https://twitter.com/oas_generator/status/1180123829626003456 |
PR checklist
./bin/
to update Petstore sample so that CIs can verify the change. (For instance, only need to run./bin/{LANG}-petstore.sh
,./bin/openapi3/{LANG}-petstore.sh
if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in.\bin\windows\
. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.master
,4.1.x
,5.0.x
. Default:master
.@ravinikam @stkrwork @etherealjoy @MartinDelille
Description of the PR
Well, this PR targets two issues:
std::vector
, which is good. But also there won't be a setter, which for me is fine, since you can get it through getter. But it doesn't setisSet
variable, which meansto_json
function doesn't do anything useful (well it puts some members into json, but not all).YAML:
HelloApiImpl.cpp:
curl http://127.0.0.1:8080/there
someints
are missingI don't know what to do with optional fields, since I wasn't able to influence current generator to generate different code (so it could omit some parameters), so currently I don't see if it does anything.
That's why I went with simpler struct like design, which may not be right if there may be optional fields.
Anyways, this new design allows more flexible syntax, especially that we won't need to create separate json/class objects to create one object from another type.
HelloApiImpl.cpp
curl http://127.0.0.1:8080/there