Как использовать переменную внутри двух ветвей Futures map_err и and_then одновременно? - PullRequest
0 голосов
/ 08 ноября 2019

Как использовать переменную 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})
        })
    }
  )
}
...