Я пытаюсь разобрать тело запроса на строго типизированный объект с помощью serde_json:
#[macro_use]
extern crate serde_derive; // 1.0.70
extern crate futures; // 0.1.23
extern crate hyper; // 0.12.7
extern crate serde_json; // 1.0.24
use futures::{Future, Stream};
use hyper::{Body, Request};
struct AppError;
#[derive(Serialize, Deserialize)]
struct BasicLoginRequest {
email: String,
password: String,
}
impl BasicLoginRequest {
fn from(req: Request<Body>) -> Result<BasicLoginRequest, AppError> {
let body = req
.body()
.fold(Vec::new(), |mut v, chunk| {
v.extend(&chunk[..]);
futures::future::ok::<_, hyper::Error>(v)
}).and_then(move |chunks| {
let p: BasicLoginRequest = serde_json::from_slice(&chunks).unwrap();
futures::future::ok(p)
}).wait();
Ok(body.unwrap())
}
}
fn main() {}
Я получаю следующую ошибку:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:20:20
|
20 | let body = req
| ____________________^
21 | | .body()
| |___________________^ cannot move out of borrowed content
Из Невозможно выйти из заимствованного содержимого при развертывании Я знаю, что эта ошибка возникает при разворачивании, потому что требуется значение, но указана ссылка. Ошибка указывает на req.body()
; похоже, что req.body()
возвращает ссылку, а не значение ...
Код, который пытается обработать тело, основан на отрывке, скопированном из Извлечение тела из гиперзапроса в виде строки
Как мне заставить это работать?