Использование метода struct с никелевыми маршрутизаторами

У меня есть структура контроллера, которая имеет метод с именем get_endpoint, Его подпись выглядит так:

pub fn get_endpoint<'mw>(self, req: &mut Request, res: &mut Response<'mw>) -> MiddlewareResult<'mw>

Я хочу использовать этот метод в качестве маршрута в никелевом маршрутизаторе. Я не могу использовать это напрямую, так как это метод. Но я не могу понять, как обернуть его в крышку, которую Никель примет. Мои попытки:

router.get(
    "/api/:endpoint", 
    middleware! { |req, res| return controller.get_endpoint(&mut req, &mut res) });

Это дает мне:

warning: unreachable expression
  --> src\main.rs:33:3
   |
33 |   middleware! { |req, res| return controller.get_endpoint(&mut req, &mut res) });
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: #[warn(unreachable_code)] on by default
   = note: this error originates in a macro outside of the current crate

error: code relies on type inference rules which are likely to change
  --> src\main.rs:33:3
   |
33 |   middleware! { |req, res| return controller.get_endpoint(&mut req, &mut res) });
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: #[deny(resolve_trait_on_defaulted_unit)] on by default
   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
   = note: for more information, see issue #39216 <https://github.com/rust-lang/rust/issues/39216>
   = note: this error originates in a macro outside of the current crate

error: aborting due to previous error

Я пытался удалить middleware! макрос:

router.get(
    "/api/:endpoint", 
    |&mut req, res| controller.get_endpoint(&mut req, &mut res));

И это дает мне другую ошибку:

error[E0271]: type mismatch resolving `for<'r, 'mw, 'conn> <[closure@src\main.rs:33:3: 33:62 controller:_] as std::ops::FnOnce<(&'r mut nickel::Request<'mw, 'conn>, nickel::Response<'mw>)>>::Output ==
std::result::Result<nickel::Action<nickel::Response<'mw>, nickel::Response<'mw, (), controller::hyper::net::Streaming>>, nickel::NickelError<'mw>>`
  --> src\main.rs:31:9
   |
31 |  router.get(
   |         ^^^ expected bound lifetime parameter 'r, found concrete lifetime
   |
   = note: required because of the requirements on the impl of `nickel::Middleware<()>` for `[closure@src\main.rs:33:3: 33:62 controller:_]`

error[E0631]: type mismatch in closure arguments
  --> src\main.rs:31:9
   |
31 |  router.get(
   |         ^^^ expected signature of `for<'r, 'mw, 'conn> fn(&'r mut nickel::Request<'mw, 'conn>, nickel::Response<'mw>) -> _`
32 |   "/api/:endpoint",
33 |   |&mut req, res| controller.get_endpoint(&mut req, &mut res));
   |   ----------------------------------------------------------- found signature of `fn(&mut nickel::Request<'_, '_>, nickel::Response<'_>) -> _`
   |
   = note: required because of the requirements on the impl of `nickel::Middleware<()>` for `[closure@src\main.rs:33:3: 33:62 controller:_]`

error: aborting due to 2 previous errors

0 ответов

Другие вопросы по тегам