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 a944e09565c..e09211fe56b 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 @@ -15,7 +15,7 @@ "{{vendorExtensions.x-path-format-string}}" {{/isCallbackRequest}} {{^isCallbackRequest}} - "{}{{{basePathWithoutHost}}}{{vendorExtensions.x-path-format-string}}", + "{}{{^servers}}{{{basePathWithoutHost}}}{{/servers}}{{#servers.0}}{{{url}}}{{/servers.0}}{{vendorExtensions.x-path-format-string}}", self.base_path {{/isCallbackRequest}} {{#pathParams}} 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 83f979a2d16..efcb502d1e9 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 @@ -330,6 +330,13 @@ paths: responses: '200': description: Success + /override-server: + get: + servers: + - "url": "/override" + responses: + "204": + description: Success. components: securitySchemes: diff --git a/samples/server/petstore/rust-server/output/openapi-v3/README.md b/samples/server/petstore/rust-server/output/openapi-v3/README.md index d2a7a17bde3..a1915a3521b 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/README.md +++ b/samples/server/petstore/rust-server/output/openapi-v3/README.md @@ -66,6 +66,7 @@ cargo run --example client MandatoryRequestHeaderGet cargo run --example client MergePatchJsonGet cargo run --example client MultigetGet cargo run --example client MultipleAuthSchemeGet +cargo run --example client OverrideServerGet cargo run --example client ParamgetGet cargo run --example client ReadonlyAuthSchemeGet cargo run --example client RegisterCallbackPost @@ -118,6 +119,7 @@ Method | HTTP request | Description [****](docs/default_api.md#) | **GET** /merge-patch-json | [****](docs/default_api.md#) | **GET** /multiget | Get some stuff. [****](docs/default_api.md#) | **GET** /multiple_auth_scheme | +[****](docs/default_api.md#) | **GET** /override-server | [****](docs/default_api.md#) | **GET** /paramget | Get some stuff with parameters. [****](docs/default_api.md#) | **GET** /readonly_auth_scheme | [****](docs/default_api.md#) | **POST** /register-callback | 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 1f8c4b7fd30..ce32d7c9424 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 @@ -338,6 +338,13 @@ paths: responses: "200": description: Success + /override-server: + get: + responses: + "204": + description: Success. + servers: + - url: /override components: schemas: EnumWithStarObject: diff --git a/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md b/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md index 97803dd5c60..f5e26ff09a1 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md +++ b/samples/server/petstore/rust-server/output/openapi-v3/docs/default_api.md @@ -10,6 +10,7 @@ Method | HTTP request | Description ****](default_api.md#) | **GET** /merge-patch-json | ****](default_api.md#) | **GET** /multiget | Get some stuff. ****](default_api.md#) | **GET** /multiple_auth_scheme | +****](default_api.md#) | **GET** /override-server | ****](default_api.md#) | **GET** /paramget | Get some stuff with parameters. ****](default_api.md#) | **GET** /readonly_auth_scheme | ****](default_api.md#) | **POST** /register-callback | @@ -166,6 +167,28 @@ This endpoint does not need any parameter. [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **** +> () + + +### Required Parameters +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **** > models::AnotherXmlObject (optional) Get some stuff with parameters. diff --git a/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs b/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs index 2ec11b74c68..072cfb409fc 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/examples/client/main.rs @@ -35,6 +35,7 @@ use openapi_v3::{Api, ApiNoContext, Client, ContextWrapperExt, MergePatchJsonGetResponse, MultigetGetResponse, MultipleAuthSchemeGetResponse, + OverrideServerGetResponse, ParamgetGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, @@ -69,6 +70,7 @@ fn main() { "MergePatchJsonGet", "MultigetGet", "MultipleAuthSchemeGet", + "OverrideServerGet", "ParamgetGet", "ReadonlyAuthSchemeGet", "RegisterCallbackPost", @@ -163,6 +165,11 @@ fn main() { )); info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &Has).get().clone()); }, + Some("OverrideServerGet") => { + let result = rt.block_on(client.override_server_get( + )); + info!("{:?} (X-Span-ID: {:?})", result, (client.context() as &Has).get().clone()); + }, Some("ParamgetGet") => { let result = rt.block_on(client.paramget_get( Some(serde_json::from_str::("38400000-8cf0-11bd-b23e-10b96e4ef00d").expect("Failed to parse JSON example")), diff --git a/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs b/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs index 0b32ac09425..2eb1e1dc31a 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/examples/server/server.rs @@ -112,6 +112,7 @@ use openapi_v3::{ MergePatchJsonGetResponse, MultigetGetResponse, MultipleAuthSchemeGetResponse, + OverrideServerGetResponse, ParamgetGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, @@ -187,6 +188,15 @@ impl Api for Server where C: Has{ Box::new(future::err("Generic failure".into())) } + fn override_server_get( + &self, + context: &C) -> Box + Send> + { + let context = context.clone(); + info!("override_server_get() - X-Span-ID: {:?}", context.get().0.clone()); + Box::new(future::err("Generic failure".into())) + } + /// Get some stuff with parameters. fn paramget_get( &self, 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 a29ff1fef06..85d530544fb 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 @@ -43,6 +43,7 @@ use {Api, MergePatchJsonGetResponse, MultigetGetResponse, MultipleAuthSchemeGetResponse, + OverrideServerGetResponse, ParamgetGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, @@ -867,6 +868,77 @@ impl Api for Client where })) } + fn override_server_get( + &self, + context: &C) -> Box + Send> + { + let mut uri = format!( + "{}/override/override-server", + self.base_path + ); + + // Query parameters + let mut query_string = url::form_urlencoded::Serializer::new("".to_owned()); + let query_string_str = query_string.finish(); + if !query_string_str.is_empty() { + uri += "?"; + uri += &query_string_str; + } + + let uri = match Uri::from_str(&uri) { + Ok(uri) => uri, + Err(err) => return Box::new(future::err(ApiError(format!("Unable to build URI: {}", err)))), + }; + + let mut request = match hyper::Request::builder() + .method("GET") + .uri(uri) + .body(Body::empty()) { + Ok(req) => req, + Err(e) => return Box::new(future::err(ApiError(format!("Unable to create request: {}", e)))) + }; + + let header = HeaderValue::from_str((context as &dyn Has).get().0.clone().to_string().as_str()); + request.headers_mut().insert(HeaderName::from_static("x-span-id"), match header { + Ok(h) => h, + Err(e) => return Box::new(future::err(ApiError(format!("Unable to create X-Span ID header value: {}", e)))) + }); + + Box::new(self.client_service.request(request) + .map_err(|e| ApiError(format!("No response received: {}", e))) + .and_then(|mut response| { + match response.status().as_u16() { + 204 => { + let body = response.into_body(); + Box::new( + future::ok( + OverrideServerGetResponse::Success + ) + ) as Box + Send> + }, + code => { + let headers = response.headers().clone(); + Box::new(response.into_body() + .take(100) + .concat2() + .then(move |body| + future::err(ApiError(format!("Unexpected response code {}:\n{:?}\n\n{}", + code, + headers, + match body { + Ok(ref body) => match str::from_utf8(body) { + Ok(body) => Cow::from(body), + Err(e) => Cow::from(format!("", e)), + }, + Err(e) => Cow::from(format!("", e)), + }))) + ) + ) as Box + Send> + } + } + })) + } + fn paramget_get( &self, param_uuid: Option, 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 5560b9170e3..1ab58202286 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 @@ -130,6 +130,12 @@ pub enum MultipleAuthSchemeGetResponse { CheckThatLimitingToMultipleRequiredAuthSchemesWorks } +#[derive(Debug, PartialEq)] +pub enum OverrideServerGetResponse { + /// Success. + Success +} + #[derive(Debug, PartialEq)] pub enum ParamgetGetResponse { /// JSON rsp @@ -283,6 +289,10 @@ pub trait Api { &self, context: &C) -> Box + Send>; + fn override_server_get( + &self, + context: &C) -> Box + Send>; + /// Get some stuff with parameters. fn paramget_get( &self, @@ -380,6 +390,10 @@ pub trait ApiNoContext { &self, ) -> Box + Send>; + fn override_server_get( + &self, + ) -> Box + Send>; + /// Get some stuff with parameters. fn paramget_get( &self, @@ -506,6 +520,13 @@ impl<'a, T: Api, C> ApiNoContext for ContextWrapper<'a, T, C> { self.api().multiple_auth_scheme_get(&self.context()) } + fn override_server_get( + &self, + ) -> Box + Send> + { + self.api().override_server_get(&self.context()) + } + /// Get some stuff with parameters. fn paramget_get( &self, 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 0e2e0857afa..c29321dce02 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 @@ -30,6 +30,7 @@ use {Api, MergePatchJsonGetResponse, MultigetGetResponse, MultipleAuthSchemeGetResponse, + OverrideServerGetResponse, ParamgetGetResponse, ReadonlyAuthSchemeGetResponse, RegisterCallbackPostResponse, @@ -58,6 +59,7 @@ mod paths { r"^/merge-patch-json$", r"^/multiget$", r"^/multiple_auth_scheme$", + r"^/override-server$", r"^/paramget$", r"^/readonly_auth_scheme$", r"^/register-callback$", @@ -83,17 +85,18 @@ mod paths { pub static ID_MERGE_PATCH_JSON: usize = 3; pub static ID_MULTIGET: usize = 4; pub static ID_MULTIPLE_AUTH_SCHEME: usize = 5; - pub static ID_PARAMGET: usize = 6; - pub static ID_READONLY_AUTH_SCHEME: usize = 7; - pub static ID_REGISTER_CALLBACK: usize = 8; - pub static ID_REQUIRED_OCTET_STREAM: usize = 9; - pub static ID_RESPONSES_WITH_HEADERS: usize = 10; - pub static ID_RFC7807: usize = 11; - pub static ID_UNTYPED_PROPERTY: usize = 12; - pub static ID_UUID: usize = 13; - pub static ID_XML: usize = 14; - pub static ID_XML_EXTRA: usize = 15; - pub static ID_XML_OTHER: usize = 16; + pub static ID_OVERRIDE_SERVER: usize = 6; + pub static ID_PARAMGET: usize = 7; + pub static ID_READONLY_AUTH_SCHEME: usize = 8; + pub static ID_REGISTER_CALLBACK: usize = 9; + pub static ID_REQUIRED_OCTET_STREAM: usize = 10; + pub static ID_RESPONSES_WITH_HEADERS: usize = 11; + pub static ID_RFC7807: usize = 12; + pub static ID_UNTYPED_PROPERTY: usize = 13; + pub static ID_UUID: usize = 14; + pub static ID_XML: usize = 15; + pub static ID_XML_EXTRA: usize = 16; + pub static ID_XML_OTHER: usize = 17; } pub struct MakeService { @@ -561,6 +564,42 @@ where }) as Self::Future }, + // OverrideServerGet - GET /override-server + &hyper::Method::GET if path.matched(paths::ID_OVERRIDE_SERVER) => { + Box::new({ + {{ + Box::new( + api_impl.override_server_get( + &context + ).then(move |result| { + let mut response = Response::new(Body::empty()); + response.headers_mut().insert( + HeaderName::from_static("x-span-id"), + HeaderValue::from_str((&context as &dyn Has).get().0.clone().to_string().as_str()) + .expect("Unable to create X-Span-ID header value")); + + match result { + Ok(rsp) => match rsp { + OverrideServerGetResponse::Success + => { + *response.status_mut() = StatusCode::from_u16(204).expect("Unable to turn 204 into a StatusCode"); + }, + }, + Err(_) => { + // Application code returned an error. This should not happen, as the implementation should + // return a valid response. + *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + *response.body_mut() = Body::from("An internal error occurred"); + }, + } + + future::ok(response) + } + )) + }} + }) as Self::Future + }, + // ParamgetGet - GET /paramget &hyper::Method::GET if path.matched(paths::ID_PARAMGET) => { // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) @@ -1419,6 +1458,7 @@ where _ if path.matched(paths::ID_MERGE_PATCH_JSON) => method_not_allowed(), _ if path.matched(paths::ID_MULTIGET) => method_not_allowed(), _ if path.matched(paths::ID_MULTIPLE_AUTH_SCHEME) => method_not_allowed(), + _ if path.matched(paths::ID_OVERRIDE_SERVER) => method_not_allowed(), _ if path.matched(paths::ID_PARAMGET) => method_not_allowed(), _ if path.matched(paths::ID_READONLY_AUTH_SCHEME) => method_not_allowed(), _ if path.matched(paths::ID_REGISTER_CALLBACK) => method_not_allowed(), @@ -1467,6 +1507,8 @@ impl RequestParser for ApiRequestParser { &hyper::Method::GET if path.matched(paths::ID_MULTIGET) => Ok("MultigetGet"), // MultipleAuthSchemeGet - GET /multiple_auth_scheme &hyper::Method::GET if path.matched(paths::ID_MULTIPLE_AUTH_SCHEME) => Ok("MultipleAuthSchemeGet"), + // OverrideServerGet - GET /override-server + &hyper::Method::GET if path.matched(paths::ID_OVERRIDE_SERVER) => Ok("OverrideServerGet"), // ParamgetGet - GET /paramget &hyper::Method::GET if path.matched(paths::ID_PARAMGET) => Ok("ParamgetGet"), // ReadonlyAuthSchemeGet - GET /readonly_auth_scheme