mirror of https://github.com/fafhrd91/actix-net
Remove need for paste (#649)
Co-authored-by: Dylan Anthony <dbanty@users.noreply.github.com>
This commit is contained in:
parent
6f5b81d2a0
commit
12df4d7027
|
@ -69,7 +69,6 @@ dependencies = [
|
||||||
"actix-utils",
|
"actix-utils",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"paste",
|
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@ rust-version.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
futures-core = { version = "0.3.17", default-features = false }
|
futures-core = { version = "0.3.17", default-features = false }
|
||||||
paste = "1"
|
|
||||||
pin-project-lite = "0.2"
|
pin-project-lite = "0.2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
|
@ -3,36 +3,38 @@
|
||||||
use alloc::{boxed::Box, rc::Rc};
|
use alloc::{boxed::Box, rc::Rc};
|
||||||
use core::{future::Future, pin::Pin};
|
use core::{future::Future, pin::Pin};
|
||||||
|
|
||||||
use paste::paste;
|
|
||||||
|
|
||||||
use crate::{Service, ServiceFactory};
|
use crate::{Service, ServiceFactory};
|
||||||
|
|
||||||
/// A boxed future with no send bound or lifetime parameters.
|
/// A boxed future with no send bound or lifetime parameters.
|
||||||
pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
|
pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
|
||||||
|
|
||||||
macro_rules! service_object {
|
/// Type alias for service trait object using [`Box`].
|
||||||
($name: ident, $type: tt, $fn_name: ident) => {
|
pub type BoxService<Req, Res, Err> =
|
||||||
paste! {
|
Box<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
|
||||||
#[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>>>,
|
|
||||||
>;
|
|
||||||
|
|
||||||
#[doc = "Wraps service as a trait object using [`" $name "`]."]
|
/// Wraps service as a trait object using [`BoxService`].
|
||||||
pub fn $fn_name<S, Req>(service: S) -> $name<Req, S::Response, S::Error>
|
pub fn service<S, Req>(service: S) -> BoxService<Req, S::Response, S::Error>
|
||||||
where
|
where
|
||||||
S: Service<Req> + 'static,
|
S: Service<Req> + 'static,
|
||||||
Req: 'static,
|
Req: 'static,
|
||||||
S::Future: 'static,
|
S::Future: 'static,
|
||||||
{
|
{
|
||||||
$type::new(ServiceWrapper::new(service))
|
Box::new(ServiceWrapper::new(service))
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
service_object!(BoxService, Box, service);
|
/// Type alias for service trait object using [`Rc`].
|
||||||
service_object!(RcService, Rc, rc_service);
|
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> {
|
struct ServiceWrapper<S> {
|
||||||
inner: S,
|
inner: S,
|
||||||
|
|
Loading…
Reference in New Issue