Trying to store a function reference, then re-use that function reference later on. enough talk, code
pub trait ArcService: Send + Sync {
fn call (&self, req: Request, res: Response) -> FutureResponse;
}
pub type FutureResponse = Box<Future<Item = Response, Error = Error>>;
impl<B, H, A> ArcService for (B, H, A)
where
B: MiddleWare + Sync + Send,
H: ArcService + Sync + Send,
A: 'static + Fn(Response) -> Response + Sync + Send,
{
fn call(&self, req: Request, res: Response) -> FutureResponse {
let request = match self.0.call(req) {
result::Ok(request) => request,
result::response(res) => {
return box Ok(res).into_future()
}
result::error(e) => {
return box Ok(e.into()).into_future()
}
};
let response = (self.1).call(request, res);
return box response.map(|response| (self.2)(response))
}
}
apparently the closure in the return statement is illegal, but the error message doesn’t make much sense to me. can anyone please help out?
arc-reactor on redesign [!] via 𝗥 v1.25.0
➜ cargo build
Compiling async-server v0.1.0 (file:///home/seun/Projects/arc-reactor)
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/ArcProto/service.rs:29:10
|
29 | return box response.map(|response| (self.2)(response))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 18:2...
--> src/ArcProto/service.rs:18:2
|
18 | fn call(&self, req: Request, res: Response) -> FutureResponse {
| _____^
19 | | let request = match self.0.call(req) {
20 | | result::Ok(request) => request,
21 | | result::response(res) => {
... |
29 | | return box response.map(|response| (self.2)(response))
30 | | }
| |_____^
note: ...so that the type `futures::Map<std::boxed::Box<futures::Future<Error=hyper::Error, Item=ArcCore::response::Response>>, [closure@src/ArcProto/service.rs:29:27: 29:56 self:&&(B, H, A)]>` will meet its required lifetime bounds
--> src/ArcProto/service.rs:29:10
|
29 | return box response.map(|response| (self.2)(response))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that types are compatible (expected std::boxed::Box<futures::Future<Error=hyper::Error, Item=ArcCore::response::Response> + 'static>, found std::boxed::Box<futures::Future<Error=hyper::Error, Item=ArcCore::response::Response>>)
--> src/ArcProto/service.rs:18:64
|
18 | fn call(&self, req: Request, res: Response) -> FutureResponse {
| ___________________________________________________________________^
19 | | let request = match self.0.call(req) {
20 | | result::Ok(request) => request,
21 | | result::response(res) => {
... |
29 | | return box response.map(|response| (self.2)(response))
30 | | }
| |_____^
error: aborting due to previous error
error: Could not compile `async-server`.
To learn more, run the command again with --verbose.
arc-reactor on redesign [!] via 𝗥 v1.25.0
➜