Nested Future Chain не называет внутреннего будущего для Rusoto RusotoFuture - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь использовать rusoto, чтобы получить список файлов с помощью ListObjects вызова на его S3 ящике, однако, когда я соединяю его цепочку, он выводит следующий набор фьючерсов, а внутренние фьючерсы, кажется, небудь я призван, я попробовал множество конфигураций одной и той же цепочки без удачи

В конце GetObject возвращает RusotoFuture<GetObjectOutput,_>, который я пытаюсь также использовать через фьючерсы, чтобы все это поведение работало вместе, но внутреннее будущее не называется, я подозреваю, что мое завершение окончательного String в futures::future::ok не работает, как я понимаю

Я пытаюсь сделать следующее

let task = s3_client1
    .list_objects(ListObjectsRequest {
        bucket: ds.bucket.clone(),
        prefix: Some("meta/datastores".to_owned()),
        ..Default::default()
    })
    .map(|list_objects| list_objects.contents.unwrap())
    .map_err(|_| ())
    .and_then(|objects| {
        //                println!("objects {:?}", objects);
        stream::iter_ok(objects)
            .map(|file_object| file_object.clone().key.unwrap())
            .and_then(move |file_key| {
                println!("filerino {:?}", &file_key);

                s3_client2
                    .get_object(GetObjectRequest {
                        bucket: ds.bucket.clone(),
                        key: file_key,
                        ..Default::default()
                    })
                    .map_err(|e| {
                        println!("Some error!!!! {:?}", e);
                        ()
                    })
                    .map(|object_output| object_output.body.unwrap())
                    .map(|body| body.concat2())
                    .map(|all_object| {
                        all_object.map_err(|e| ()).and_then(|bytes| {
                            let result = String::from_utf8(bytes).unwrap();
                            println!("body: {:?}", &result);
                            futures::future::ok::<String, ()>(result)
                        })
                    })
            })
            .collect()
    })
    .map_err(|e| {
        println!("eeeerroor  {:?}", e);
        ()
    })
    .map(|_x| {
        //                println!("done! {:?}", x);
        println!("done!");
    });

tokio::spawn(task);
...