0

I'm trying to get the following to work but it runs into moving the req to extract path and app data from it.

                web::scope("/{entity_id}")
                    .wrap_fn(|req, srv| {
                        let entity_id = req
                            .match_info()
                            .get("entity_id")
                            .expect("Entity Id not found, invlaid  url")
                            .to_string()
                            .parse::<uuid::Uuid>()
                            .expect("Invalid entity_id");

                        let db_pool = req
                            .app_data::<web::Data<PgPool>>()
                            .expect("Something went wrong extracting db pool");
                        // let db_pool = req.extensions().get::<web::Data<PgPool>>().unwrap();

                        let fut = srv.call(req);

                        Box::pin(async move {
                            // get entity
                            if entities_dal::EntityDAL::get_entity_by_id(
                                &entity_id,
                                db_pool.as_ref(),
                            )
                            .await
                            .is_err()
                            {
                                tracing::error!("create_transaction: Entity not found");
                                return Err(actix_web::error::ErrorBadRequest("Entity not found"));
                            }

                            Ok(fut.await?)
                        })
                    })

I get the following error

error[E0505]: cannot move out of `req` because it is borrowed
--> src/app/entities/mod.rs:173:44
|
159 |                       .wrap_fn(|req, srv| {
|                                         - return type of closure `Pin<Box<[async block@src/app/entities/mod.rs:175:34: 189:26]>>` contains a lifetime `'1`
...
168 |                           let db_pool = req
|  _______________________________________-
169 | |                             .app_data::<web::Data<PgPool>>()
| |____________________________________________________________- borrow of `req` occurs here
...
173 |                           let fut = srv.call(req);
|                                              ^^^ move out of `req` occurs here
174 |
175 | /                         Box::pin(async move {
176 | |                             // get entity
177 | |                             if entities_dal::EntityDAL::get_entity_by_id(
178 | |                                 &entity_id,
...   |
188 | |                             Ok(fut.await?)
189 | |                         })
| |__________________________- returning this value requires that `req` is borrowed for `'1`

error[E0515]: cannot return value referencing function parameter `req`
--> src/app/entities/mod.rs:175:25
|
168 |                           let db_pool = req
|  _______________________________________-
169 | |                             .app_data::<web::Data<PgPool>>()
| |____________________________________________________________- `req` is borrowed here
...
175 | /                         Box::pin(async move {
176 | |                             // get entity
177 | |                             if entities_dal::EntityDAL::get_entity_by_id(
178 | |                                 &entity_id,
...   |
188 | |                             Ok(fut.await?)
189 | |                         })
| |__________________________^ returns a value referencing data owned by the current function

Some errors have detailed explanations: E0505, E0515.
For more information about an error, try `rustc --explain E0505`.

I understand that req is being moved and in a way consumed to it cannot be used, however it doesnt implement Clone/Copy so i dont know what to do.I'm new to rust and this is my first large project, i come from Nodejs background. Any help is appreciated.

Deep Vora
  • 318
  • 3
  • 13
  • I've tried that with the same problem of `req` being borrowed when i make the `req.app_data` call it also runs into lifetime problem as req goes out of scope before srv – Deep Vora Aug 15 '23 at 13:56
  • Oh right the returned future is one of these: [Why can't I store a value and a reference to that value in the same struct?](https://stackoverflow.com/questions/32300132/why-cant-i-store-a-value-and-a-reference-to-that-value-in-the-same-struct) Or in other words it's not possible to return it in safe Rust. – cafce25 Aug 15 '23 at 13:59

0 Answers0