diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 15228ef7dda2..e61d57729938 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4518,6 +4518,11 @@ protected void addHeaders(ApiResponse response, List 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); } } diff --git a/modules/openapi-generator/src/main/resources/rust-server/client-operation.mustache b/modules/openapi-generator/src/main/resources/rust-server/client-operation.mustache index a027811c122a..ad5e378163ac 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/client-operation.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/client-operation.mustache @@ -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::>::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::>::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(); diff --git a/modules/openapi-generator/src/main/resources/rust-server/response.mustache b/modules/openapi-generator/src/main/resources/rust-server/response.mustache index ca2dbe7a6a6c..9269eea6386f 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/response.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/response.mustache @@ -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}} diff --git a/modules/openapi-generator/src/main/resources/rust-server/server-operation.mustache b/modules/openapi-generator/src/main/resources/rust-server/server-operation.mustache index 8243908defd7..1d649007d590 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/server-operation.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/server-operation.mustache @@ -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) => { @@ -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}} diff --git a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml index 4f224edf40c5..6ddb63ad761b 100644 --- a/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/rust-server/openapi-v3.yaml @@ -227,6 +227,7 @@ paths: Success-Info: schema: type: String + required: true Bool-Header: schema: type: bool diff --git a/samples/server/petstore/rust-server/output/multipart-v3/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/multipart-v3/.openapi-generator/FILES index e1eb1a7a36f6..93ca2d464365 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/multipart-v3/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml diff --git a/samples/server/petstore/rust-server/output/no-example-v3/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/no-example-v3/.openapi-generator/FILES index 2334dbd17046..7e3a3959055f 100644 --- a/samples/server/petstore/rust-server/output/no-example-v3/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/no-example-v3/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml diff --git a/samples/server/petstore/rust-server/output/openapi-v3/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/openapi-v3/.openapi-generator/FILES index 5033d9399037..fb555b825a64 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/openapi-v3/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml diff --git a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml index 894bb1537ab6..d823d207fa52 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml +++ b/samples/server/petstore/rust-server/output/openapi-v3/api/openapi.yaml @@ -211,6 +211,7 @@ paths: headers: Success-Info: explode: false + required: true schema: type: String style: simple diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs index 46a800969749..37dc771813a8 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs @@ -1425,46 +1425,49 @@ impl Api for Client 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::>::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::>::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::>::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::>::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::>::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::>::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 @@ -1484,32 +1487,34 @@ impl Api for Client 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::>::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::>::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::>::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::>::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( diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs index fee0011bc984..47f01fcbfece 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/lib.rs @@ -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 + > } } diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs index 1244ae2af5b3..b8454d3afc0c 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs @@ -877,6 +877,11 @@ impl hyper::service::Service<(Request, C)> for Service where } }; + response.headers_mut().insert( + HeaderName::from_static("success-info"), + success_info + ); + if let Some(bool_header) = bool_header { let bool_header = match header::IntoHeaderValue(bool_header).try_into() { Ok(val) => val, Err(e) => { @@ -887,6 +892,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; + response.headers_mut().insert( + HeaderName::from_static("bool-header"), + bool_header + ); + } + if let Some(object_header) = object_header { let object_header = match header::IntoHeaderValue(object_header).try_into() { Ok(val) => val, Err(e) => { @@ -897,19 +908,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; - *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); - response.headers_mut().insert( - HeaderName::from_static("success-info"), - success_info - ); - response.headers_mut().insert( - HeaderName::from_static("bool-header"), - bool_header - ); response.headers_mut().insert( HeaderName::from_static("object-header"), object_header ); + } + *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); response.headers_mut().insert( CONTENT_TYPE, HeaderValue::from_str("application/json") @@ -923,6 +927,7 @@ impl hyper::service::Service<(Request, C)> for Service where failure_info } => { + if let Some(further_info) = further_info { let further_info = match header::IntoHeaderValue(further_info).try_into() { Ok(val) => val, Err(e) => { @@ -933,6 +938,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; + response.headers_mut().insert( + HeaderName::from_static("further-info"), + further_info + ); + } + if let Some(failure_info) = failure_info { let failure_info = match header::IntoHeaderValue(failure_info).try_into() { Ok(val) => val, Err(e) => { @@ -943,15 +954,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; - *response.status_mut() = StatusCode::from_u16(412).expect("Unable to turn 412 into a StatusCode"); - response.headers_mut().insert( - HeaderName::from_static("further-info"), - further_info - ); response.headers_mut().insert( HeaderName::from_static("failure-info"), failure_info ); + } + *response.status_mut() = StatusCode::from_u16(412).expect("Unable to turn 412 into a StatusCode"); }, }, Err(_) => { diff --git a/samples/server/petstore/rust-server/output/ops-v3/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/ops-v3/.openapi-generator/FILES index e86946909bdb..7aa723e3c57c 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/ops-v3/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/.openapi-generator/FILES index 03bc5ac35073..47093f45af67 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs index f6e3986c318e..8ac2909d4d89 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs @@ -3399,32 +3399,34 @@ impl Api for Client where match response.status().as_u16() { 200 => { let response_x_rate_limit = match response.headers().get(HeaderName::from_static("x-rate-limit")) { - Some(response_x_rate_limit) => response_x_rate_limit.clone(), - None => { - return Err(ApiError(String::from("Required response header X-Rate-Limit for response 200 was not found."))); - } - }; - let response_x_rate_limit = match TryInto::>::try_into(response_x_rate_limit) { - Ok(value) => value, - Err(e) => { - return Err(ApiError(format!("Invalid response header X-Rate-Limit for response 200 - {}", e))); - }, + Some(response_x_rate_limit) => { + let response_x_rate_limit = response_x_rate_limit.clone(); + let response_x_rate_limit = match TryInto::>::try_into(response_x_rate_limit) { + Ok(value) => value, + Err(e) => { + return Err(ApiError(format!("Invalid response header X-Rate-Limit for response 200 - {}", e))); + }, + }; + let response_x_rate_limit = response_x_rate_limit.0; + Some(response_x_rate_limit) + }, + None => None, }; - let response_x_rate_limit = response_x_rate_limit.0; let response_x_expires_after = match response.headers().get(HeaderName::from_static("x-expires-after")) { - Some(response_x_expires_after) => response_x_expires_after.clone(), - None => { - return Err(ApiError(String::from("Required response header X-Expires-After for response 200 was not found."))); - } - }; - let response_x_expires_after = match TryInto::>>::try_into(response_x_expires_after) { - Ok(value) => value, - Err(e) => { - return Err(ApiError(format!("Invalid response header X-Expires-After for response 200 - {}", e))); - }, + Some(response_x_expires_after) => { + let response_x_expires_after = response_x_expires_after.clone(); + let response_x_expires_after = match TryInto::>>::try_into(response_x_expires_after) { + Ok(value) => value, + Err(e) => { + return Err(ApiError(format!("Invalid response header X-Expires-After for response 200 - {}", e))); + }, + }; + let response_x_expires_after = response_x_expires_after.0; + Some(response_x_expires_after) + }, + None => None, }; - let response_x_expires_after = response_x_expires_after.0; let body = response.into_body(); let body = body diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/lib.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/lib.rs index 03eae5fb7653..601410d3be94 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/lib.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/lib.rs @@ -281,8 +281,15 @@ pub enum LoginUserResponse { SuccessfulOperation { body: String, - x_rate_limit: i32, - x_expires_after: chrono::DateTime:: + x_rate_limit: + Option< + i32 + > + , + x_expires_after: + Option< + chrono::DateTime:: + > } , /// Invalid username/password supplied diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs index 1cbdc1fda254..0db144870980 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs @@ -2734,6 +2734,7 @@ impl hyper::service::Service<(Request, C)> for Service where x_expires_after } => { + if let Some(x_rate_limit) = x_rate_limit { let x_rate_limit = match header::IntoHeaderValue(x_rate_limit).try_into() { Ok(val) => val, Err(e) => { @@ -2744,6 +2745,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; + response.headers_mut().insert( + HeaderName::from_static("x-rate-limit"), + x_rate_limit + ); + } + if let Some(x_expires_after) = x_expires_after { let x_expires_after = match header::IntoHeaderValue(x_expires_after).try_into() { Ok(val) => val, Err(e) => { @@ -2754,15 +2761,12 @@ impl hyper::service::Service<(Request, C)> for Service where } }; - *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); - response.headers_mut().insert( - HeaderName::from_static("x-rate-limit"), - x_rate_limit - ); response.headers_mut().insert( HeaderName::from_static("x-expires-after"), x_expires_after ); + } + *response.status_mut() = StatusCode::from_u16(200).expect("Unable to turn 200 into a StatusCode"); response.headers_mut().insert( CONTENT_TYPE, HeaderValue::from_str("application/xml") diff --git a/samples/server/petstore/rust-server/output/rust-server-test/.openapi-generator/FILES b/samples/server/petstore/rust-server/output/rust-server-test/.openapi-generator/FILES index 1495d4416fbc..9f49d72aaaa9 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/.openapi-generator/FILES +++ b/samples/server/petstore/rust-server/output/rust-server-test/.openapi-generator/FILES @@ -1,5 +1,6 @@ .cargo/config .gitignore +.openapi-generator-ignore Cargo.toml README.md api/openapi.yaml