use std::future::Future;
use http::Method;
use serde::{Deserialize, Serialize};
use crate::body::ZeroBody;
use crate::error::Result;
use crate::ops::common::DataRedundancyType;
use crate::response::BodyResponseProcessor;
use crate::ser::OnlyKeyField;
use crate::{Client, Ops, Prepared, Request};
#[derive(Debug, Clone, Serialize)]
pub struct CreateBucketDataRedundancyTransitionParams {
#[serde(rename = "redundancyTransition")]
redundancy_transition: OnlyKeyField,
#[serde(rename = "x-oss-target-redundancy-type")]
pub target_redundancy_type: DataRedundancyType,
}
impl CreateBucketDataRedundancyTransitionParams {
pub fn new(target: DataRedundancyType) -> Self {
Self {
redundancy_transition: OnlyKeyField,
target_redundancy_type: target,
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(rename = "BucketDataRedundancyTransition", rename_all = "PascalCase")]
pub struct CreateBucketDataRedundancyTransitionResponse {
pub task_id: String,
}
pub struct CreateBucketDataRedundancyTransition {
pub target_redundancy_type: DataRedundancyType,
}
impl Ops for CreateBucketDataRedundancyTransition {
type Response = BodyResponseProcessor<CreateBucketDataRedundancyTransitionResponse>;
type Body = ZeroBody;
type Query = CreateBucketDataRedundancyTransitionParams;
fn prepare(self) -> Result<Prepared<CreateBucketDataRedundancyTransitionParams>> {
Ok(Prepared {
method: Method::POST,
query: Some(CreateBucketDataRedundancyTransitionParams::new(self.target_redundancy_type)),
body: Some(()),
..Default::default()
})
}
}
pub trait CreateBucketDataRedundancyTransitionOps {
fn create_bucket_data_redundancy_transition(
&self,
target: DataRedundancyType,
) -> impl Future<Output = Result<CreateBucketDataRedundancyTransitionResponse>>;
}
impl CreateBucketDataRedundancyTransitionOps for Client {
async fn create_bucket_data_redundancy_transition(
&self,
target: DataRedundancyType,
) -> Result<CreateBucketDataRedundancyTransitionResponse> {
self.request(CreateBucketDataRedundancyTransition {
target_redundancy_type: target,
})
.await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn params_serialize() {
let q = crate::ser::to_string(&CreateBucketDataRedundancyTransitionParams::new(
DataRedundancyType::ZoneRedundantStorage,
))
.unwrap();
assert_eq!(q, "redundancyTransition&x-oss-target-redundancy-type=ZRS");
}
#[test]
fn parse_response() {
let xml =
r#"<BucketDataRedundancyTransition><TaskId>task-1</TaskId></BucketDataRedundancyTransition>"#;
let parsed: CreateBucketDataRedundancyTransitionResponse = quick_xml::de::from_str(xml).unwrap();
assert_eq!(parsed.task_id, "task-1");
}
}