#[async_trait::async_trait]
pub trait RewriteObjectExt {
async fn rewrite_until_done(self) -> crate::Result<crate::model::Object>;
}
#[async_trait::async_trait]
impl RewriteObjectExt for crate::builder::storage_control::RewriteObject {
async fn rewrite_until_done(mut self) -> crate::Result<crate::model::Object> {
loop {
let resp = self.clone().send().await?;
if resp.done {
return Ok(resp
.resource
.expect("an object is always returned when the rewrite operation is done"));
}
self = self.set_rewrite_token(resp.rewrite_token);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::StorageControl;
use crate::model::{Object, RewriteObjectRequest, RewriteResponse};
use google_cloud_gax::error::rpc::{Code, Status};
use google_cloud_gax::options::RequestOptions;
use google_cloud_gax::response::Response;
mockall::mock! {
#[derive(Debug)]
StorageControl {}
impl crate::stub::StorageControl for StorageControl {
async fn rewrite_object( &self, _req: RewriteObjectRequest, _options: RequestOptions) -> crate::Result<Response<RewriteResponse>>;
}
}
#[tokio::test]
async fn test_rewrite_until_done() -> anyhow::Result<()> {
let mut mock = MockStorageControl::new();
let final_object = Object::new().set_name("final-object");
let mut seq = mockall::Sequence::new();
mock.expect_rewrite_object()
.withf(|req: &RewriteObjectRequest, _| req.rewrite_token.is_empty())
.times(1)
.in_sequence(&mut seq)
.returning(|_, _| {
Ok(Response::from(
RewriteResponse::new()
.set_done(false)
.set_rewrite_token("token1"),
))
});
mock.expect_rewrite_object()
.withf(|req: &RewriteObjectRequest, _| req.rewrite_token == "token1")
.times(1)
.in_sequence(&mut seq)
.returning({
let obj = final_object.clone();
move |_, _| {
Ok(Response::from(
RewriteResponse::new()
.set_done(true)
.set_resource(obj.clone()),
))
}
});
let client = StorageControl::from_stub(mock);
let result = client.rewrite_object().rewrite_until_done().await?;
assert_eq!(result, final_object);
Ok(())
}
#[tokio::test]
async fn test_rewrite_until_done_error() -> anyhow::Result<()> {
let mut mock = MockStorageControl::new();
mock.expect_rewrite_object()
.withf(|req: &RewriteObjectRequest, _| req.rewrite_token.is_empty())
.times(1)
.returning(|_, _| {
Err(crate::Error::service(
Status::default().set_code(Code::Unavailable),
))
});
let client = StorageControl::from_stub(mock);
let _ = client
.rewrite_object()
.rewrite_until_done()
.await
.unwrap_err();
Ok(())
}
}