mirror of
https://github.com/fafhrd91/actix-net
synced 2025-03-20 17:15:17 +01:00
fix auto-traits for service types (#397)
This commit is contained in:
parent
07e3b19461
commit
62ffe5f389
@ -1,6 +1,9 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
* Service types can now be `Send` and `'static` regardless of request, response, and config types, etc.. [#397]
|
||||||
|
|
||||||
|
[#397]: https://github.com/actix/actix-net/pull/397
|
||||||
|
|
||||||
|
|
||||||
## 2.0.1 - 2021-10-11
|
## 2.0.1 - 2021-10-11
|
||||||
|
@ -51,7 +51,7 @@ where
|
|||||||
{
|
{
|
||||||
service: S,
|
service: S,
|
||||||
wrap_fn: F,
|
wrap_fn: F,
|
||||||
_phantom: PhantomData<(Req, In, Res, Err)>,
|
_phantom: PhantomData<fn(Req) -> (In, Res, Err)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S, F, Fut, Req, In, Res, Err> Apply<S, F, Req, In, Res, Err>
|
impl<S, F, Fut, Req, In, Res, Err> Apply<S, F, Req, In, Res, Err>
|
||||||
@ -106,7 +106,7 @@ where
|
|||||||
pub struct ApplyFactory<SF, F, Req, In, Res, Err> {
|
pub struct ApplyFactory<SF, F, Req, In, Res, Err> {
|
||||||
factory: SF,
|
factory: SF,
|
||||||
wrap_fn: F,
|
wrap_fn: F,
|
||||||
_phantom: PhantomData<(Req, In, Res, Err)>,
|
_phantom: PhantomData<fn(Req) -> (In, Res, Err)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<SF, F, Fut, Req, In, Res, Err> ApplyFactory<SF, F, Req, In, Res, Err>
|
impl<SF, F, Fut, Req, In, Res, Err> ApplyFactory<SF, F, Req, In, Res, Err>
|
||||||
@ -171,7 +171,7 @@ pin_project! {
|
|||||||
#[pin]
|
#[pin]
|
||||||
fut: SF::Future,
|
fut: SF::Future,
|
||||||
wrap_fn: Option<F>,
|
wrap_fn: Option<F>,
|
||||||
_phantom: PhantomData<(Req, Res)>,
|
_phantom: PhantomData<fn(Req) -> Res>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ where
|
|||||||
Fut: Future<Output = Result<Res, Err>>,
|
Fut: Future<Output = Result<Res, Err>>,
|
||||||
{
|
{
|
||||||
f: F,
|
f: F,
|
||||||
_t: PhantomData<Req>,
|
_t: PhantomData<fn(Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, Fut, Req, Res, Err> FnService<F, Fut, Req, Res, Err>
|
impl<F, Fut, Req, Res, Err> FnService<F, Fut, Req, Res, Err>
|
||||||
@ -160,7 +160,7 @@ where
|
|||||||
Fut: Future<Output = Result<Res, Err>>,
|
Fut: Future<Output = Result<Res, Err>>,
|
||||||
{
|
{
|
||||||
f: F,
|
f: F,
|
||||||
_t: PhantomData<(Req, Cfg)>,
|
_t: PhantomData<fn(Req, Cfg)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, Fut, Req, Res, Err, Cfg> FnServiceFactory<F, Fut, Req, Res, Err, Cfg>
|
impl<F, Fut, Req, Res, Err, Cfg> FnServiceFactory<F, Fut, Req, Res, Err, Cfg>
|
||||||
@ -237,7 +237,7 @@ where
|
|||||||
Srv: Service<Req>,
|
Srv: Service<Req>,
|
||||||
{
|
{
|
||||||
f: F,
|
f: F,
|
||||||
_t: PhantomData<(Fut, Cfg, Req, Srv, Err)>,
|
_t: PhantomData<fn(Cfg, Req) -> (Fut, Srv, Err)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, Fut, Cfg, Srv, Req, Err> FnServiceConfig<F, Fut, Cfg, Srv, Req, Err>
|
impl<F, Fut, Cfg, Srv, Req, Err> FnServiceConfig<F, Fut, Cfg, Srv, Req, Err>
|
||||||
@ -293,7 +293,7 @@ where
|
|||||||
Fut: Future<Output = Result<Srv, Err>>,
|
Fut: Future<Output = Result<Srv, Err>>,
|
||||||
{
|
{
|
||||||
f: F,
|
f: F,
|
||||||
_t: PhantomData<(Cfg, Req)>,
|
_t: PhantomData<fn(Cfg, Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, Cfg, Srv, Req, Fut, Err> FnServiceNoConfig<F, Cfg, Srv, Req, Fut, Err>
|
impl<F, Cfg, Srv, Req, Fut, Err> FnServiceNoConfig<F, Cfg, Srv, Req, Fut, Err>
|
||||||
@ -391,4 +391,40 @@ mod tests {
|
|||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
assert_eq!(res.unwrap(), ("srv", 1));
|
assert_eq!(res.unwrap(), ("srv", 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[actix_rt::test]
|
||||||
|
async fn test_auto_impl_send() {
|
||||||
|
use crate::{map_config, ServiceExt, ServiceFactoryExt};
|
||||||
|
use alloc::rc::Rc;
|
||||||
|
|
||||||
|
let srv_1 = fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)));
|
||||||
|
|
||||||
|
let fac_1 = fn_factory_with_config(|_: Rc<u8>| {
|
||||||
|
ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8))))
|
||||||
|
});
|
||||||
|
|
||||||
|
let fac_2 = fn_factory(|| {
|
||||||
|
ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8))))
|
||||||
|
});
|
||||||
|
|
||||||
|
fn is_send<T: Send + Sync + Clone>(_: &T) {}
|
||||||
|
|
||||||
|
is_send(&fac_1);
|
||||||
|
is_send(&map_config(fac_1.clone(), |_: Rc<u8>| Rc::new(0u8)));
|
||||||
|
is_send(&fac_1.clone().map_err(|_| Rc::new(0u8)));
|
||||||
|
is_send(&fac_1.clone().map(|_| Rc::new(0u8)));
|
||||||
|
is_send(&fac_1.clone().map_init_err(|_| Rc::new(0u8)));
|
||||||
|
// `and_then` is always !Send
|
||||||
|
// is_send(&fac_1.clone().and_then(fac_1.clone()));
|
||||||
|
is_send(&fac_1.new_service(Rc::new(0u8)).await.unwrap());
|
||||||
|
|
||||||
|
is_send(&fac_2);
|
||||||
|
is_send(&fac_2.new_service(Rc::new(0u8)).await.unwrap());
|
||||||
|
|
||||||
|
is_send(&srv_1);
|
||||||
|
is_send(&ServiceExt::map(srv_1.clone(), |_| Rc::new(0u8)));
|
||||||
|
is_send(&ServiceExt::map_err(srv_1.clone(), |_| Rc::new(0u8)));
|
||||||
|
// `and_then` is always !Send
|
||||||
|
// is_send(&ServiceExt::and_then(srv_1.clone(), srv_1.clone()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ use super::{Service, ServiceFactory};
|
|||||||
pub struct Map<A, F, Req, Res> {
|
pub struct Map<A, F, Req, Res> {
|
||||||
service: A,
|
service: A,
|
||||||
f: F,
|
f: F,
|
||||||
_t: PhantomData<(Req, Res)>,
|
_t: PhantomData<fn(Req) -> Res>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A, F, Req, Res> Map<A, F, Req, Res> {
|
impl<A, F, Req, Res> Map<A, F, Req, Res> {
|
||||||
@ -107,7 +107,7 @@ where
|
|||||||
pub struct MapServiceFactory<A, F, Req, Res> {
|
pub struct MapServiceFactory<A, F, Req, Res> {
|
||||||
a: A,
|
a: A,
|
||||||
f: F,
|
f: F,
|
||||||
r: PhantomData<(Res, Req)>,
|
r: PhantomData<fn(Req) -> Res>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A, F, Req, Res> MapServiceFactory<A, F, Req, Res> {
|
impl<A, F, Req, Res> MapServiceFactory<A, F, Req, Res> {
|
||||||
|
@ -28,7 +28,7 @@ where
|
|||||||
pub struct MapConfig<SF, Req, F, Cfg> {
|
pub struct MapConfig<SF, Req, F, Cfg> {
|
||||||
factory: SF,
|
factory: SF,
|
||||||
cfg_mapper: F,
|
cfg_mapper: F,
|
||||||
e: PhantomData<(Cfg, Req)>,
|
e: PhantomData<fn(Cfg, Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<SF, Req, F, Cfg> MapConfig<SF, Req, F, Cfg> {
|
impl<SF, Req, F, Cfg> MapConfig<SF, Req, F, Cfg> {
|
||||||
@ -82,7 +82,7 @@ where
|
|||||||
/// `unit_config()` config combinator
|
/// `unit_config()` config combinator
|
||||||
pub struct UnitConfig<SF, Cfg, Req> {
|
pub struct UnitConfig<SF, Cfg, Req> {
|
||||||
factory: SF,
|
factory: SF,
|
||||||
_phantom: PhantomData<(Cfg, Req)>,
|
_phantom: PhantomData<fn(Cfg, Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<SF, Cfg, Req> UnitConfig<SF, Cfg, Req>
|
impl<SF, Cfg, Req> UnitConfig<SF, Cfg, Req>
|
||||||
|
@ -15,7 +15,7 @@ use super::{Service, ServiceFactory};
|
|||||||
pub struct MapErr<S, Req, F, E> {
|
pub struct MapErr<S, Req, F, E> {
|
||||||
service: S,
|
service: S,
|
||||||
mapper: F,
|
mapper: F,
|
||||||
_t: PhantomData<(E, Req)>,
|
_t: PhantomData<fn(Req) -> E>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S, Req, F, E> MapErr<S, Req, F, E> {
|
impl<S, Req, F, E> MapErr<S, Req, F, E> {
|
||||||
@ -111,7 +111,7 @@ where
|
|||||||
{
|
{
|
||||||
a: SF,
|
a: SF,
|
||||||
f: F,
|
f: F,
|
||||||
e: PhantomData<(E, Req)>,
|
e: PhantomData<fn(Req) -> E>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<SF, Req, F, E> MapErrServiceFactory<SF, Req, F, E>
|
impl<SF, Req, F, E> MapErrServiceFactory<SF, Req, F, E>
|
||||||
|
@ -13,7 +13,7 @@ use super::ServiceFactory;
|
|||||||
pub struct MapInitErr<A, F, Req, Err> {
|
pub struct MapInitErr<A, F, Req, Err> {
|
||||||
a: A,
|
a: A,
|
||||||
f: F,
|
f: F,
|
||||||
e: PhantomData<(Req, Err)>,
|
e: PhantomData<fn(Req) -> Err>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A, F, Req, Err> MapInitErr<A, F, Req, Err>
|
impl<A, F, Req, Err> MapInitErr<A, F, Req, Err>
|
||||||
|
@ -40,7 +40,7 @@ where
|
|||||||
/// Pipeline service - pipeline allows to compose multiple service into one service.
|
/// Pipeline service - pipeline allows to compose multiple service into one service.
|
||||||
pub(crate) struct Pipeline<S, Req> {
|
pub(crate) struct Pipeline<S, Req> {
|
||||||
service: S,
|
service: S,
|
||||||
_phantom: PhantomData<Req>,
|
_phantom: PhantomData<fn(Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S, Req> Pipeline<S, Req>
|
impl<S, Req> Pipeline<S, Req>
|
||||||
@ -162,7 +162,7 @@ impl<S: Service<Req>, Req> Service<Req> for Pipeline<S, Req> {
|
|||||||
/// Pipeline factory
|
/// Pipeline factory
|
||||||
pub(crate) struct PipelineFactory<SF, Req> {
|
pub(crate) struct PipelineFactory<SF, Req> {
|
||||||
factory: SF,
|
factory: SF,
|
||||||
_phantom: PhantomData<Req>,
|
_phantom: PhantomData<fn(Req)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<SF, Req> PipelineFactory<SF, Req>
|
impl<SF, Req> PipelineFactory<SF, Req>
|
||||||
|
@ -14,7 +14,7 @@ use super::Transform;
|
|||||||
pub struct TransformMapInitErr<T, S, Req, F, E> {
|
pub struct TransformMapInitErr<T, S, Req, F, E> {
|
||||||
transform: T,
|
transform: T,
|
||||||
mapper: F,
|
mapper: F,
|
||||||
_phantom: PhantomData<(S, Req, E)>,
|
_phantom: PhantomData<fn(Req) -> (S, E)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, S, F, E, Req> TransformMapInitErr<T, S, Req, F, E> {
|
impl<T, S, F, E, Req> TransformMapInitErr<T, S, Req, F, E> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user