Size: a a a

2021 August 04

V

Vetro in Rust Async
impl<S, B> Future for MetricsResponse<S, B>
where
   B: MessageBody,
   S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
{
   type Output = Result<ServiceResponse<StreamMetrics<B>>, Error>;

   fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
       let this = self.project();

       let start = *this.start;

       let res = match futures::ready!(this.fut.poll(cx)) {
           Ok(res) => res,
           Err(e) => return Poll::Ready(Err(e)),
       };

       let req = res.request();
       let method = req.method().clone();
       let pattern_or_path = req
           .match_pattern()
           .unwrap_or_else(|| req.path().to_string());
       let path = req.path().to_string();
       let inner = this.inner.clone();

       Poll::Ready(Ok(res.map_body(move |mut head, mut body| {
           // We short circuit the response status and body to serve the endpoint
           // automagically. This way the user does not need to set the middleware *AND*
           // an endpoint to serve middleware results. The user is only required to set
           // the middleware and tell us what the endpoint should be.
           if inner.matches(&path, &method) {
               head.status = StatusCode::OK;
               head.headers.insert(
                   CONTENT_TYPE,
                   HeaderValue::from_static("text/plain; version=0.0.4; charset=utf-8"),
               );
           }

           StreamMetrics {
               body: B::from(inner.metrics()),
               size: 0,
               start,
               end: inner.clock.end(),
               inner,
               status: head.status,
               path: pattern_or_path,
               method,
           }
       })))
   }
}
источник

V

Vetro in Rust Async
error[E0308]: mismatched types
  --> app/src/metrics.rs:176:31
   |
137 | impl<S, B> Future for MetricsResponse<S, B>
   |         - this type parameter
...
176 |                 body: B::from(inner.metrics()),
   |                               ^^^^^^^^^^^^^^^ expected type parameter `B`, found struct `std::string::String`
   |
   = note: expected type parameter `B`
                      found struct `std::string::String`
источник

V

Vetro in Rust Async
Пытаюсь заимплементить миддлварю для последний версии актикс веба, но не уверен что понимаю, как работают их новые типы тел.
источник

V

Vetro in Rust Async
metrics() возвращает String

может кто сталкивался?
источник

V

Vetro in Rust Async
Пробовал через AnyBody, и тогда сама миддлварь компилилась успешно
источник

V

Vetro in Rust Async
Но при попытке закинуть в wrap - увы
источник

V

Vetro in Rust Async
Версия актикса - последняя бета
источник

IB

Ivan Boldyrev in Rust Async
На B должно быть ограничение: B: From<String>.
источник

V

Vetro in Rust Async
Так не получилось, по-другому сделал в итоге
источник
2021 August 06

MS

Mikola Summer Duck in Rust Async
Окей тут тоже спрошу — я наспавнил в токио эн (маленькое, извесное на момент написания) тасков возвращающих Result<!, Error>. Я хочу как только один из них вернёт ошибку заабортить все остальные (через JoinHandle::abort). Есть что-то готовое для этого за пределами select!?
источник

MS

Mikola Summer Duck in Rust Async
Хотя тут и select не сработает, т.к. он хавает джойнхендлы :(
источник

П

Пух in Rust Async
Хавает и дропает, емнип
источник

MS

Mikola Summer Duck in Rust Async
Ну да
источник

MS

Mikola Summer Duck in Rust Async
Не дропает
источник

П

Пух in Rust Async
А, оно не абортится
источник

MS

Mikola Summer Duck in Rust Async
Но хавает
источник

MS

Mikola Summer Duck in Rust Async
Ага
источник

MS

Mikola Summer Duck in Rust Async
Так что задача со звёздочкой.
источник

П

Пух in Rust Async
select_all глянь
источник

MS

Mikola Summer Duck in Rust Async
Кстати да, next() + into_inner() должны сработать. Спасибо 👍
источник