Rust: Как передать gRPC-клиента в State (общие данные)

Изучаю Rust. Gateway на Actix-Web. Можно ли поместить grpc-клиента в State приложения и затем дергать его в handler'ах? Чтобы не создавать его в каждом handler'е. Если можно, то как это сделать?

[main.rs]

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let channel = Channel::from_static("http://127.0.0.1:5051")
    .connect()
    .await.unwrap();

    let token = AsciiMetadataValue::from_static("...");
    let mut user_client = UserServiceClient::with_interceptor(channel, move |mut req: Request<()>| {
        req.metadata_mut().insert("authorization", token);
        Ok(req)
    });
    let shared_data = web::Data::new(State {
        user_client: user_client,
    });

    let app = move || {
    App::new()
       .app_data(shared_data.clone()) ...
...
}

[user_handler.rs]

pub async fn get_users(path: web::Path<(i64,i64)>, state: web::Data<State>,) -> Result<HttpResponse, AppError> {
    let request = tonic::Request::new(...);
    let mut client = UserServiceClient::connect("http://127.0.0.1:5051").await?;
    let mut grpc_response = client.list_users(request).await?.into_inner();
    let json_response: UsersListResponse = grpc_response.into();
    Ok(HttpResponse::Ok().json(json_response))
}

[state.rs]

pub struct State {
    pub user_client: UserServiceClient<InterceptedService<Channel, fn(Request<()>) -> Result<Request<()>, Status>>>,
}

Ошибка в State


Ответы (0 шт):