From 12df4d7027e4d07d29655c2a87ec86315b3e02d1 Mon Sep 17 00:00:00 2001 From: Dylan Anthony <43723790+dbanty@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:53:48 -0600 Subject: [PATCH] Remove need for paste (#649) Co-authored-by: Dylan Anthony <dbanty@users.noreply.github.com> --- Cargo.lock | 1 - actix-service/Cargo.toml | 1 - actix-service/src/boxed.rs | 46 ++++++++++++++++++++------------------ 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30f79e5d..d884859a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,7 +69,6 @@ dependencies = [ "actix-utils", "futures-core", "futures-util", - "paste", "pin-project-lite", ] diff --git a/actix-service/Cargo.toml b/actix-service/Cargo.toml index f0be441b..64273943 100644 --- a/actix-service/Cargo.toml +++ b/actix-service/Cargo.toml @@ -12,7 +12,6 @@ rust-version.workspace = true [dependencies] futures-core = { version = "0.3.17", default-features = false } -paste = "1" pin-project-lite = "0.2" [dev-dependencies] diff --git a/actix-service/src/boxed.rs b/actix-service/src/boxed.rs index cc9ad410..e3f7a80b 100644 --- a/actix-service/src/boxed.rs +++ b/actix-service/src/boxed.rs @@ -3,36 +3,38 @@ use alloc::{boxed::Box, rc::Rc}; use core::{future::Future, pin::Pin}; -use paste::paste; - use crate::{Service, ServiceFactory}; /// A boxed future with no send bound or lifetime parameters. pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>; -macro_rules! service_object { - ($name: ident, $type: tt, $fn_name: ident) => { - paste! { - #[doc = "Type alias for service trait object using `" $type "`."] - pub type $name<Req, Res, Err> = $type< - dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>, - >; +/// Type alias for service trait object using [`Box`]. +pub type BoxService<Req, Res, Err> = + Box<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>; - #[doc = "Wraps service as a trait object using [`" $name "`]."] - pub fn $fn_name<S, Req>(service: S) -> $name<Req, S::Response, S::Error> - where - S: Service<Req> + 'static, - Req: 'static, - S::Future: 'static, - { - $type::new(ServiceWrapper::new(service)) - } - } - }; +/// Wraps service as a trait object using [`BoxService`]. +pub fn service<S, Req>(service: S) -> BoxService<Req, S::Response, S::Error> +where + S: Service<Req> + 'static, + Req: 'static, + S::Future: 'static, +{ + Box::new(ServiceWrapper::new(service)) } -service_object!(BoxService, Box, service); -service_object!(RcService, Rc, rc_service); +/// Type alias for service trait object using [`Rc`]. +pub type RcService<Req, Res, Err> = + Rc<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>; + +/// Wraps service as a trait object using [`RcService`]. +pub fn rc_service<S, Req>(service: S) -> RcService<Req, S::Response, S::Error> +where + S: Service<Req> + 'static, + Req: 'static, + S::Future: 'static, +{ + Rc::new(ServiceWrapper::new(service)) +} struct ServiceWrapper<S> { inner: S,