Skip to content
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

[Core, Rust Server] Support optional headers #6575

Merged
merged 4 commits into from
Jun 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4518,6 +4518,11 @@ protected void addHeaders(ApiResponse response, List<CodegenProperty> properties
CodegenProperty cp = fromProperty(headerEntry.getKey(), schema);
cp.setDescription(escapeText(description));
cp.setUnescapedDescription(description);
if (header.getRequired() != null) {
cp.setRequired(header.getRequired());
} else {
cp.setRequired(false);
}
properties.add(cp);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -373,18 +373,29 @@
{{{code}}} => {
{{#headers}}
let response_{{{name}}} = match response.headers().get(HeaderName::from_static("{{{nameInLowerCase}}}")) {
Some(response_{{{name}}}) => response_{{{name}}}.clone(),
None => {
return Err(ApiError(String::from("Required response header {{{baseName}}} for response {{{code}}} was not found.")));
}
};
let response_{{{name}}} = match TryInto::<header::IntoHeaderValue<{{{dataType}}}>>::try_into(response_{{{name}}}) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header {{baseName}} for response {{code}} - {}", e)));
},
Some(response_{{{name}}}) => {
let response_{{{name}}} = response_{{{name}}}.clone();
let response_{{{name}}} = match TryInto::<header::IntoHeaderValue<{{{dataType}}}>>::try_into(response_{{{name}}}) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header {{baseName}} for response {{code}} - {}", e)));
},
};
let response_{{{name}}} = response_{{{name}}}.0;
{{#required}}
response_{{{name}}}
{{/required}}
{{^required}}
Some(response_{{{name}}})
{{/required}}
},
{{#required}}
None => return Err(ApiError(String::from("Required response header {{{baseName}}} for response {{{code}}} was not found."))),
{{/required}}
{{^required}}
None => None,
{{/required}}
};
let response_{{{name}}} = response_{{{name}}}.0;

{{/headers}}
let body = response.into_body();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,17 @@ pub enum {{{operationId}}}Response {
{{/hasHeaders}}
{{/dataType}}
{{#headers}}
{{{name}}}: {{{datatype}}}{{^-last}},{{/-last}}
{{{name}}}:
{{^required}}
Option<
{{/required}}
{{{datatype}}}
{{^required}}
>
{{/required}}
{{^-last}}
,
{{/-last}}
{{#-last}}
}
{{/-last}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,9 @@
{{/dataType}}
=> {
{{#headers}}
{{^required}}
if let Some({{{name}}}) = {{{name}}} {
{{/required}}
let {{{name}}} = match header::IntoHeaderValue({{{name}}}).try_into() {
Ok(val) => val,
Err(e) => {
Expand All @@ -506,14 +509,15 @@
}
};

{{/headers}}
*response.status_mut() = StatusCode::from_u16({{{code}}}).expect("Unable to turn {{{code}}} into a StatusCode");
{{#headers}}
response.headers_mut().insert(
HeaderName::from_static("{{{nameInLowerCase}}}"),
{{name}}
);
{{^required}}
}
{{/required}}
{{/headers}}
*response.status_mut() = StatusCode::from_u16({{{code}}}).expect("Unable to turn {{{code}}} into a StatusCode");
{{#produces}}
{{#-first}}
{{#dataType}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ paths:
Success-Info:
schema:
type: String
required: true
Bool-Header:
schema:
type: bool
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.cargo/config
.gitignore
.openapi-generator-ignore
Cargo.toml
README.md
api/openapi.yaml
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.cargo/config
.gitignore
.openapi-generator-ignore
Cargo.toml
README.md
api/openapi.yaml
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.cargo/config
.gitignore
.openapi-generator-ignore
Cargo.toml
README.md
api/openapi.yaml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ paths:
headers:
Success-Info:
explode: false
required: true
schema:
type: String
style: simple
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1425,46 +1425,49 @@ impl<C, S> Api<C> for Client<S> where
match response.status().as_u16() {
200 => {
let response_success_info = match response.headers().get(HeaderName::from_static("success-info")) {
Some(response_success_info) => response_success_info.clone(),
None => {
return Err(ApiError(String::from("Required response header Success-Info for response 200 was not found.")));
}
};
let response_success_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_success_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Success-Info for response 200 - {}", e)));
},
Some(response_success_info) => {
let response_success_info = response_success_info.clone();
let response_success_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_success_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Success-Info for response 200 - {}", e)));
},
};
let response_success_info = response_success_info.0;
response_success_info
},
None => return Err(ApiError(String::from("Required response header Success-Info for response 200 was not found."))),
};
let response_success_info = response_success_info.0;

let response_bool_header = match response.headers().get(HeaderName::from_static("bool-header")) {
Some(response_bool_header) => response_bool_header.clone(),
None => {
return Err(ApiError(String::from("Required response header Bool-Header for response 200 was not found.")));
}
};
let response_bool_header = match TryInto::<header::IntoHeaderValue<bool>>::try_into(response_bool_header) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Bool-Header for response 200 - {}", e)));
},
Some(response_bool_header) => {
let response_bool_header = response_bool_header.clone();
let response_bool_header = match TryInto::<header::IntoHeaderValue<bool>>::try_into(response_bool_header) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Bool-Header for response 200 - {}", e)));
},
};
let response_bool_header = response_bool_header.0;
Some(response_bool_header)
},
None => None,
};
let response_bool_header = response_bool_header.0;

let response_object_header = match response.headers().get(HeaderName::from_static("object-header")) {
Some(response_object_header) => response_object_header.clone(),
None => {
return Err(ApiError(String::from("Required response header Object-Header for response 200 was not found.")));
}
};
let response_object_header = match TryInto::<header::IntoHeaderValue<models::ObjectHeader>>::try_into(response_object_header) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Object-Header for response 200 - {}", e)));
},
Some(response_object_header) => {
let response_object_header = response_object_header.clone();
let response_object_header = match TryInto::<header::IntoHeaderValue<models::ObjectHeader>>::try_into(response_object_header) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Object-Header for response 200 - {}", e)));
},
};
let response_object_header = response_object_header.0;
Some(response_object_header)
},
None => None,
};
let response_object_header = response_object_header.0;

let body = response.into_body();
let body = body
Expand All @@ -1484,32 +1487,34 @@ impl<C, S> Api<C> for Client<S> where
}
412 => {
let response_further_info = match response.headers().get(HeaderName::from_static("further-info")) {
Some(response_further_info) => response_further_info.clone(),
None => {
return Err(ApiError(String::from("Required response header Further-Info for response 412 was not found.")));
}
};
let response_further_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_further_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Further-Info for response 412 - {}", e)));
},
Some(response_further_info) => {
let response_further_info = response_further_info.clone();
let response_further_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_further_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Further-Info for response 412 - {}", e)));
},
};
let response_further_info = response_further_info.0;
Some(response_further_info)
},
None => None,
};
let response_further_info = response_further_info.0;

let response_failure_info = match response.headers().get(HeaderName::from_static("failure-info")) {
Some(response_failure_info) => response_failure_info.clone(),
None => {
return Err(ApiError(String::from("Required response header Failure-Info for response 412 was not found.")));
}
};
let response_failure_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_failure_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Failure-Info for response 412 - {}", e)));
},
Some(response_failure_info) => {
let response_failure_info = response_failure_info.clone();
let response_failure_info = match TryInto::<header::IntoHeaderValue<String>>::try_into(response_failure_info) {
Ok(value) => value,
Err(e) => {
return Err(ApiError(format!("Invalid response header Failure-Info for response 412 - {}", e)));
},
};
let response_failure_info = response_failure_info.0;
Some(response_failure_info)
},
None => None,
};
let response_failure_info = response_failure_info.0;

let body = response.into_body();
Ok(
Expand Down
26 changes: 21 additions & 5 deletions samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,32 @@ pub enum ResponsesWithHeadersGetResponse {
Success
{
body: String,
success_info: String,
bool_header: bool,
object_header: models::ObjectHeader
success_info:
String
,
bool_header:
Option<
bool
>
,
object_header:
Option<
models::ObjectHeader
>
}
,
/// Precondition Failed
PreconditionFailed
{
further_info: String,
failure_info: String
further_info:
Option<
String
>
,
failure_info:
Option<
String
>
}
}

Expand Down
Loading