diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java index a39033a4501..2d4cb2b4daf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java @@ -198,7 +198,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("lib.mustache", "src", "lib.rs")); supportingFiles.add(new SupportingFile("models.mustache", "src", "models.rs")); supportingFiles.add(new SupportingFile("server-mod.mustache", "src/server", "mod.rs")); - supportingFiles.add(new SupportingFile("server-auth.mustache", "src/server", "auth.rs")); + supportingFiles.add(new SupportingFile("server-context.mustache", "src/server", "context.rs")); supportingFiles.add(new SupportingFile("client-mod.mustache", "src/client", "mod.rs")); supportingFiles.add(new SupportingFile("mimetypes.mustache", "src", "mimetypes.rs")); supportingFiles.add(new SupportingFile("example-server.mustache", "examples", "server.rs")); diff --git a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache index 78061ff6469..462ee2aab0a 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache @@ -19,7 +19,7 @@ chrono = { version = "0.4", features = ["serde"] } futures = "0.1" hyper = {version = "0.11", optional = true} hyper-tls = {version = "0.1.2", optional = true} -swagger = "0.12.1" +swagger = "1.0.1" # Not required by example server. # diff --git a/modules/openapi-generator/src/main/resources/rust-server/example-server.mustache b/modules/openapi-generator/src/main/resources/rust-server/example-server.mustache index 6c0f4ce86ba..eb68fedc54d 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/example-server.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/example-server.mustache @@ -55,7 +55,7 @@ fn main() { .get_matches(); let service_fn = - {{{externCrateName}}}::server::auth::NewService::<_, EmptyContext>::new( + {{{externCrateName}}}::server::context::NewAddContext::<_, EmptyContext>::new( AllowAllAuthenticator::new( server_lib::NewService::new(), "cosmo" diff --git a/modules/openapi-generator/src/main/resources/rust-server/server-auth.mustache b/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache similarity index 52% rename from modules/openapi-generator/src/main/resources/rust-server/server-auth.mustache rename to modules/openapi-generator/src/main/resources/rust-server/server-context.mustache index c58a2adceae..75b37a63089 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/server-auth.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache @@ -8,76 +8,72 @@ use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; use Api; -pub struct NewService - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error>, +pub struct NewAddContext { inner: T, - marker: PhantomData, + marker: PhantomData, } -impl NewService +impl NewAddContext where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error> + 'static, + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::NewService + 'static, { - pub fn new(inner: T) -> NewService { - NewService { + pub fn new(inner: T) -> NewAddContext { + NewAddContext { inner, marker: PhantomData, } } } -impl hyper::server::NewService for NewService +impl hyper::server::NewService for NewAddContext where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error> + 'static, + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::NewService + 'static, { type Request = Request; type Response = Response; type Error = Error; - type Instance = Service; + type Instance = AddContext; fn new_service(&self) -> Result { - self.inner.new_service().map(|s| Service::new(s)) + self.inner.new_service().map(|s| AddContext::new(s)) } } /// Middleware to extract authentication data from request -pub struct Service - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, +pub struct AddContext { inner: T, - marker: PhantomData, + marker: PhantomData, } -impl Service +impl AddContext where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::Service, { - pub fn new(inner: T) -> Service { - Service { + pub fn new(inner: T) -> AddContext { + AddContext { inner, marker: PhantomData, } } } -impl hyper::server::Service for Service +impl hyper::server::Service for AddContext where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::Service, { type Request = Request; type Response = Response; @@ -85,27 +81,29 @@ impl hyper::server::Service for Service type Future = T::Future; fn call(&self, req: Self::Request) -> Self::Future { - let context = C::default().push(XSpanIdString::get_or_generate(&req)); + let context = A::default().push(XSpanIdString::get_or_generate(&req)); {{#authMethods}} {{#isBasic}} { - use hyper::header::{Authorization, Basic, Bearer}; + use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(basic) = req.headers().get::>().cloned() { + if let Some(basic) = req.headers().get::>().cloned() { let auth_data = AuthData::Basic(basic.deref().clone()); let context = context.push(Some(auth_data)); + let context = context.push(None::); return self.inner.call((req, context)); } } {{/isBasic}} {{#isOAuth}} { - use hyper::header::{Authorization, Basic, Bearer}; + use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(bearer) = req.headers().get::>().cloned() { + if let Some(bearer) = req.headers().get::>().cloned() { let auth_data = AuthData::Bearer(bearer.deref().clone()); let context = context.push(Some(auth_data)); + let context = context.push(None::); return self.inner.call((req, context)); } } @@ -117,6 +115,7 @@ impl hyper::server::Service for Service if let Some(header) = req.headers().get::().cloned() { let auth_data = AuthData::ApiKey(header.0); let context = context.push(Some(auth_data)); + let context = context.push(None::); return self.inner.call((req, context)); } } @@ -130,6 +129,7 @@ impl hyper::server::Service for Service if let Some(key) = key { let auth_data = AuthData::ApiKey(key); let context = context.push(Some(auth_data)); + let context = context.push(None::); return self.inner.call((req, context)); } } @@ -137,7 +137,8 @@ impl hyper::server::Service for Service {{/isApiKey}} {{/authMethods}} - let context = context.push(None); + let context = context.push(None::); + let context = context.push(None::); return self.inner.call((req, context)); } } diff --git a/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache b/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache index 15a3cc23ee5..e635d9432cd 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache @@ -42,7 +42,7 @@ use {Api{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}, #[allow(unused_imports)] use models; -pub mod auth; +pub mod context; header! { (Warning, "Warning") => [String] } @@ -370,3 +370,13 @@ where } } } + +impl Clone for Service +{ + fn clone(&self) -> Self { + Service { + api_impl: self.api_impl.clone(), + marker: self.marker.clone(), + } + } +} diff --git a/samples/server/petstore/rust-server/Cargo.toml b/samples/server/petstore/rust-server/Cargo.toml index 5e6be7d7a41..2cbbb4cc2e3 100644 --- a/samples/server/petstore/rust-server/Cargo.toml +++ b/samples/server/petstore/rust-server/Cargo.toml @@ -17,7 +17,7 @@ chrono = { version = "0.4", features = ["serde"] } futures = "0.1" hyper = {version = "0.11", optional = true} hyper-tls = {version = "0.1.2", optional = true} -swagger = "0.12.1" +swagger = "1.0.1" # Not required by example server. # diff --git a/samples/server/petstore/rust-server/examples/server.rs b/samples/server/petstore/rust-server/examples/server.rs index f3846ade0ea..270b1e5cdb2 100644 --- a/samples/server/petstore/rust-server/examples/server.rs +++ b/samples/server/petstore/rust-server/examples/server.rs @@ -55,7 +55,7 @@ fn main() { .get_matches(); let service_fn = - petstore_api::server::auth::NewService::<_, EmptyContext>::new( + petstore_api::server::context::NewAddContext::<_, EmptyContext>::new( AllowAllAuthenticator::new( server_lib::NewService::new(), "cosmo" diff --git a/samples/server/petstore/rust-server/src/server/auth.rs b/samples/server/petstore/rust-server/src/server/auth.rs deleted file mode 100644 index 1c770bcf6a7..00000000000 --- a/samples/server/petstore/rust-server/src/server/auth.rs +++ /dev/null @@ -1,131 +0,0 @@ -use std::io; -use std::marker::PhantomData; -use std::default::Default; -use hyper; -use hyper::{Request, Response, Error, StatusCode}; -use server::url::form_urlencoded; -use swagger::auth::{Authorization, AuthData, Scopes}; -use swagger::{Has, Pop, Push, XSpanIdString}; -use Api; - -pub struct NewService - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error>, -{ - inner: T, - marker: PhantomData, -} - -impl NewService - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error> + 'static, -{ - pub fn new(inner: T) -> NewService { - NewService { - inner, - marker: PhantomData, - } - } -} - -impl hyper::server::NewService for NewService - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::NewService>>::Result), Response = Response, Error = Error> + 'static, -{ - type Request = Request; - type Response = Response; - type Error = Error; - type Instance = Service; - - fn new_service(&self) -> Result { - self.inner.new_service().map(|s| Service::new(s)) - } -} - -/// Middleware to extract authentication data from request -pub struct Service - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, -{ - inner: T, - marker: PhantomData, -} - -impl Service - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, -{ - pub fn new(inner: T) -> Service { - Service { - inner, - marker: PhantomData, - } - } -} - -impl hyper::server::Service for Service - where - C: Default + Push, - C::Result: Push>, - T: hyper::server::Service>>::Result), Response = Response, Error = Error>, -{ - type Request = Request; - type Response = Response; - type Error = Error; - type Future = T::Future; - - fn call(&self, req: Self::Request) -> Self::Future { - let context = C::default().push(XSpanIdString::get_or_generate(&req)); - - { - header! { (ApiKey1, "api_key") => [String] } - if let Some(header) = req.headers().get::().cloned() { - let auth_data = AuthData::ApiKey(header.0); - let context = context.push(Some(auth_data)); - return self.inner.call((req, context)); - } - } - { - let key = form_urlencoded::parse(req.query().unwrap_or_default().as_bytes()) - .filter(|e| e.0 == "api_key_query") - .map(|e| e.1.clone().into_owned()) - .nth(0); - if let Some(key) = key { - let auth_data = AuthData::ApiKey(key); - let context = context.push(Some(auth_data)); - return self.inner.call((req, context)); - } - } - { - use hyper::header::{Authorization, Basic, Bearer}; - use std::ops::Deref; - if let Some(basic) = req.headers().get::>().cloned() { - let auth_data = AuthData::Basic(basic.deref().clone()); - let context = context.push(Some(auth_data)); - return self.inner.call((req, context)); - } - } - { - use hyper::header::{Authorization, Basic, Bearer}; - use std::ops::Deref; - if let Some(bearer) = req.headers().get::>().cloned() { - let auth_data = AuthData::Bearer(bearer.deref().clone()); - let context = context.push(Some(auth_data)); - return self.inner.call((req, context)); - } - } - - let context = context.push(None); - return self.inner.call((req, context)); - } -} diff --git a/samples/server/petstore/rust-server/src/server/context.rs b/samples/server/petstore/rust-server/src/server/context.rs new file mode 100644 index 00000000000..010f21f45b0 --- /dev/null +++ b/samples/server/petstore/rust-server/src/server/context.rs @@ -0,0 +1,132 @@ +use std::io; +use std::marker::PhantomData; +use std::default::Default; +use hyper; +use hyper::{Request, Response, Error, StatusCode}; +use server::url::form_urlencoded; +use swagger::auth::{Authorization, AuthData, Scopes}; +use swagger::{Has, Pop, Push, XSpanIdString}; +use Api; + +pub struct NewAddContext +{ + inner: T, + marker: PhantomData, +} + +impl NewAddContext + where + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::NewService + 'static, +{ + pub fn new(inner: T) -> NewAddContext { + NewAddContext { + inner, + marker: PhantomData, + } + } +} + +impl hyper::server::NewService for NewAddContext + where + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::NewService + 'static, +{ + type Request = Request; + type Response = Response; + type Error = Error; + type Instance = AddContext; + + fn new_service(&self) -> Result { + self.inner.new_service().map(|s| AddContext::new(s)) + } +} + +/// Middleware to extract authentication data from request +pub struct AddContext +{ + inner: T, + marker: PhantomData, +} + +impl AddContext + where + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::Service, +{ + pub fn new(inner: T) -> AddContext { + AddContext { + inner, + marker: PhantomData, + } + } +} + +impl hyper::server::Service for AddContext + where + A: Default + Push, + B: Push, Result=C>, + C: Push, Result=D>, + T: hyper::server::Service, +{ + type Request = Request; + type Response = Response; + type Error = Error; + type Future = T::Future; + + fn call(&self, req: Self::Request) -> Self::Future { + let context = A::default().push(XSpanIdString::get_or_generate(&req)); + + { + header! { (ApiKey1, "api_key") => [String] } + if let Some(header) = req.headers().get::().cloned() { + let auth_data = AuthData::ApiKey(header.0); + let context = context.push(Some(auth_data)); + let context = context.push(None::); + return self.inner.call((req, context)); + } + } + { + let key = form_urlencoded::parse(req.query().unwrap_or_default().as_bytes()) + .filter(|e| e.0 == "api_key_query") + .map(|e| e.1.clone().into_owned()) + .nth(0); + if let Some(key) = key { + let auth_data = AuthData::ApiKey(key); + let context = context.push(Some(auth_data)); + let context = context.push(None::); + return self.inner.call((req, context)); + } + } + { + use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; + use std::ops::Deref; + if let Some(basic) = req.headers().get::>().cloned() { + let auth_data = AuthData::Basic(basic.deref().clone()); + let context = context.push(Some(auth_data)); + let context = context.push(None::); + return self.inner.call((req, context)); + } + } + { + use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; + use std::ops::Deref; + if let Some(bearer) = req.headers().get::>().cloned() { + let auth_data = AuthData::Bearer(bearer.deref().clone()); + let context = context.push(Some(auth_data)); + let context = context.push(None::); + return self.inner.call((req, context)); + } + } + + let context = context.push(None::); + let context = context.push(None::); + return self.inner.call((req, context)); + } +} diff --git a/samples/server/petstore/rust-server/src/server/mod.rs b/samples/server/petstore/rust-server/src/server/mod.rs index b035544d69f..8366ae215e2 100644 --- a/samples/server/petstore/rust-server/src/server/mod.rs +++ b/samples/server/petstore/rust-server/src/server/mod.rs @@ -73,7 +73,7 @@ use {Api, #[allow(unused_imports)] use models; -pub mod auth; +pub mod context; header! { (Warning, "Warning") => [String] } @@ -2939,3 +2939,13 @@ where } } } + +impl Clone for Service +{ + fn clone(&self) -> Self { + Service { + api_impl: self.api_impl.clone(), + marker: self.marker.clone(), + } + } +}