ossify/ops/bucket/replication/
put_bucket_rtc.rs1use std::future::Future;
6
7use http::Method;
8use serde::Serialize;
9
10use crate::body::XMLBody;
11use crate::error::Result;
12use crate::ops::common::{Rtc, RtcStatus};
13use crate::response::EmptyResponseProcessor;
14use crate::ser::OnlyKeyField;
15use crate::{Client, Ops, Prepared, Request};
16
17#[derive(Debug, Clone, Default, Serialize)]
18pub struct PutBucketRtcParams {
19 rtc: OnlyKeyField,
20}
21
22#[derive(Debug, Clone, Serialize)]
24#[serde(rename = "ReplicationRule", rename_all = "PascalCase")]
25pub struct PutBucketRtcBody {
26 #[serde(rename = "RTC")]
27 pub rtc: Rtc,
28 #[serde(rename = "ID")]
29 pub id: String,
30}
31
32impl PutBucketRtcBody {
33 pub fn new(rule_id: impl Into<String>, status: RtcStatus) -> Self {
34 Self {
35 rtc: Rtc { status },
36 id: rule_id.into(),
37 }
38 }
39}
40
41pub struct PutBucketRtc {
42 pub body: PutBucketRtcBody,
43}
44
45impl Ops for PutBucketRtc {
46 type Response = EmptyResponseProcessor;
47 type Body = XMLBody<PutBucketRtcBody>;
48 type Query = PutBucketRtcParams;
49
50 fn prepare(self) -> Result<Prepared<PutBucketRtcParams, PutBucketRtcBody>> {
51 Ok(Prepared {
52 method: Method::PUT,
53 query: Some(PutBucketRtcParams::default()),
54 body: Some(self.body),
55 ..Default::default()
56 })
57 }
58}
59
60pub trait PutBucketRtcOps {
61 fn put_bucket_rtc(
65 &self,
66 rule_id: impl Into<String>,
67 status: RtcStatus,
68 ) -> impl Future<Output = Result<()>>;
69}
70
71impl PutBucketRtcOps for Client {
72 async fn put_bucket_rtc(&self, rule_id: impl Into<String>, status: RtcStatus) -> Result<()> {
73 self.request(PutBucketRtc {
74 body: PutBucketRtcBody::new(rule_id, status),
75 })
76 .await
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83
84 #[test]
85 fn params_serialize() {
86 assert_eq!(crate::ser::to_string(&PutBucketRtcParams::default()).unwrap(), "rtc");
87 }
88
89 #[test]
90 fn body_serialize() {
91 let body = PutBucketRtcBody::new("rule-1", RtcStatus::Enabled);
92 let xml = quick_xml::se::to_string(&body).unwrap();
93 assert!(xml.contains("<RTC>"));
94 assert!(xml.contains("<Status>enabled</Status>"));
95 assert!(xml.contains("<ID>rule-1</ID>"));
96 }
97
98 #[test]
99 fn prepared_uses_put() {
100 let prepared = PutBucketRtc {
101 body: PutBucketRtcBody::new("r", RtcStatus::Disabled),
102 }
103 .prepare()
104 .unwrap();
105 assert_eq!(prepared.method, Method::PUT);
106 }
107}