Как использовать переменную THEVARIABLE
внутри блоков .map_err
и .and_then
?
Существуют проблемы с семантикой перемещения, из-за которой ржавчина пытается переместить ее в две разные области. Как решить эту проблему?
THEVARIABLE
необходимо передать как объект JS, а не как строку JS.
use actix_web::{client::Client, HttpResponse};
use serde::{Deserialize, Serialize};
use futures::Future;
#[derive(Serialize, Deserialize, Debug)] //just an example of non-Clone, non-Copy
struct Ex {
field1: String
}
#[derive(Serialize, Deserialize, Debug)]
struct Ex2 {
res: bool,
data: String,
ex: Ex
}
#[derive(Serialize, Deserialize, Debug)]
enum RequestError {
RequestError(String),
BodyError(String),
ParseError(String),
}
fn func () -> Box<dyn Future<Item = HttpResponse>, Error = HttpResponse> {
Box::new(
futures::lazy(move || {
let THEVARIABLE: Ex = Ex{field1: "qwerty".to_string()};
let client = Client::new();
client.post("https://url")
.send_json(Ex{field1: "req".to_string()})
.map_err(|e| {
RequestError::RequestError(format!("{:?}", e))
)
.and_then(|mut res| res.body().map_err(|e| {
RequestError::BodyError(format!("{:?}", e))
})
)
.and_then(|body| {
match String::from_utf8(body.to_vec()) {
Ok(s) => Ok(HttpResponse::Ok().json(Ex2{res: true, data: s, ex: THEVARIABLE})),
Err(e) => Err(RequestError::ParseError(format!("{:?}", e)))
}
})
.map_err(|e| {
HttpResponse::InternalServerError().json(Ex2{res: false, data: format!("{:?}", e), ex: THEVARIABLE})
})
}
)
}