From 90b9dffce7e2ec3f7a991bb1288f98e85378b4ec Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Tue, 1 Jun 2021 12:25:28 +0200 Subject: [PATCH] Add remaining routing methods --- src/routing.rs | 116 ++++++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 54 deletions(-) diff --git a/src/routing.rs b/src/routing.rs index 68d11427..04920cf5 100644 --- a/src/routing.rs +++ b/src/routing.rs @@ -45,34 +45,60 @@ pub struct RouteAt { pub(crate) route_spec: Bytes, } +macro_rules! define_route_at_methods { + ( + RouteAt: + $name:ident, + $svc_method_name:ident, + $method:ident + ) => { + pub fn $name(self, handler_fn: F) -> RouteBuilder, R>> + where + F: Handler, + { + self.add_route(handler_fn, Method::$method) + } + + pub fn $svc_method_name(self, service: S) -> RouteBuilder> + where + S: Service, Response = Response, Error = Infallible> + Clone, + { + self.add_route_service(service, Method::$method) + } + }; + + ( + RouteBuilder: + $name:ident, + $svc_method_name:ident, + $method:ident + ) => { + pub fn $name(self, handler_fn: F) -> RouteBuilder, R>> + where + F: Handler, + { + self.app.at_bytes(self.route_spec).$name(handler_fn) + } + + pub fn $svc_method_name(self, service: S) -> RouteBuilder> + where + S: Service, Response = Response, Error = Infallible> + Clone, + { + self.app.at_bytes(self.route_spec).$svc_method_name(service) + } + }; +} + impl RouteAt { - pub fn get(self, handler_fn: F) -> RouteBuilder, R>> - where - F: Handler, - { - self.add_route(handler_fn, Method::GET) - } - - pub fn get_service(self, service: S) -> RouteBuilder> - where - S: Service, Response = Response, Error = Infallible> + Clone, - { - self.add_route_service(service, Method::GET) - } - - pub fn post(self, handler_fn: F) -> RouteBuilder, R>> - where - F: Handler, - { - self.add_route(handler_fn, Method::POST) - } - - pub fn post_service(self, service: S) -> RouteBuilder> - where - S: Service, Response = Response, Error = Infallible> + Clone, - { - self.add_route_service(service, Method::POST) - } + define_route_at_methods!(RouteAt: get, get_service, GET); + define_route_at_methods!(RouteAt: post, post_service, POST); + define_route_at_methods!(RouteAt: put, put_service, PUT); + define_route_at_methods!(RouteAt: patch, patch_service, PATCH); + define_route_at_methods!(RouteAt: delete, delete_service, DELETE); + define_route_at_methods!(RouteAt: head, head_service, HEAD); + define_route_at_methods!(RouteAt: options, options_service, OPTIONS); + define_route_at_methods!(RouteAt: connect, connect_service, CONNECT); + define_route_at_methods!(RouteAt: trace, trace_service, TRACE); fn add_route( self, @@ -130,33 +156,15 @@ impl RouteBuilder { self.app.at(route_spec) } - pub fn get(self, handler_fn: F) -> RouteBuilder, R>> - where - F: Handler, - { - self.app.at_bytes(self.route_spec).get(handler_fn) - } - - pub fn get_service(self, service: S) -> RouteBuilder> - where - S: Service, Response = Response, Error = Infallible> + Clone, - { - self.app.at_bytes(self.route_spec).get_service(service) - } - - pub fn post(self, handler_fn: F) -> RouteBuilder, R>> - where - F: Handler, - { - self.app.at_bytes(self.route_spec).post(handler_fn) - } - - pub fn post_service(self, service: S) -> RouteBuilder> - where - S: Service, Response = Response, Error = Infallible> + Clone, - { - self.app.at_bytes(self.route_spec).post_service(service) - } + define_route_at_methods!(RouteBuilder: get, get_service, GET); + define_route_at_methods!(RouteBuilder: post, post_service, POST); + define_route_at_methods!(RouteBuilder: put, put_service, PUT); + define_route_at_methods!(RouteBuilder: patch, patch_service, PATCH); + define_route_at_methods!(RouteBuilder: delete, delete_service, DELETE); + define_route_at_methods!(RouteBuilder: head, head_service, HEAD); + define_route_at_methods!(RouteBuilder: options, options_service, OPTIONS); + define_route_at_methods!(RouteBuilder: connect, connect_service, CONNECT); + define_route_at_methods!(RouteBuilder: trace, trace_service, TRACE); pub fn into_service(self) -> IntoService { IntoService { app: self.app }