Skip to main content

ossify/ops/bucket/access_monitor/
put_bucket_access_monitor.rs

1//! PutBucketAccessMonitor.
2//!
3//! Official document: <https://www.alibabacloud.com/help/en/oss/developer-reference/putbucketaccessmonitor>
4
5use std::future::Future;
6
7use http::Method;
8use serde::{Deserialize, Serialize};
9
10use crate::body::XMLBody;
11use crate::error::Result;
12use crate::response::EmptyResponseProcessor;
13use crate::ser::OnlyKeyField;
14use crate::{Client, Ops, Prepared, Request};
15
16#[derive(Debug, Clone, Default, Serialize)]
17pub struct PutBucketAccessMonitorParams {
18    accessmonitor: OnlyKeyField,
19}
20
21/// Access tracking status.
22#[derive(Copy, Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
23pub enum AccessMonitorStatus {
24    #[default]
25    Enabled,
26    Disabled,
27}
28
29impl AccessMonitorStatus {
30    pub fn as_str(&self) -> &'static str {
31        match self {
32            AccessMonitorStatus::Enabled => "Enabled",
33            AccessMonitorStatus::Disabled => "Disabled",
34        }
35    }
36}
37
38impl AsRef<str> for AccessMonitorStatus {
39    fn as_ref(&self) -> &str {
40        self.as_str()
41    }
42}
43
44/// Root `<AccessMonitorConfiguration>` element.
45#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
46#[serde(rename = "AccessMonitorConfiguration", rename_all = "PascalCase")]
47pub struct AccessMonitorConfiguration {
48    pub status: AccessMonitorStatus,
49}
50
51pub struct PutBucketAccessMonitor {
52    pub status: AccessMonitorStatus,
53}
54
55impl Ops for PutBucketAccessMonitor {
56    type Response = EmptyResponseProcessor;
57    type Body = XMLBody<AccessMonitorConfiguration>;
58    type Query = PutBucketAccessMonitorParams;
59
60    fn prepare(self) -> Result<Prepared<PutBucketAccessMonitorParams, AccessMonitorConfiguration>> {
61        Ok(Prepared {
62            method: Method::PUT,
63            query: Some(PutBucketAccessMonitorParams::default()),
64            body: Some(AccessMonitorConfiguration { status: self.status }),
65            ..Default::default()
66        })
67    }
68}
69
70pub trait PutBucketAccessMonitorOps {
71    /// Enable or disable access tracking for the bucket.
72    ///
73    /// Official document: <https://www.alibabacloud.com/help/en/oss/developer-reference/putbucketaccessmonitor>
74    fn put_bucket_access_monitor(&self, status: AccessMonitorStatus) -> impl Future<Output = Result<()>>;
75}
76
77impl PutBucketAccessMonitorOps for Client {
78    async fn put_bucket_access_monitor(&self, status: AccessMonitorStatus) -> Result<()> {
79        self.request(PutBucketAccessMonitor { status }).await
80    }
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn params_serialize() {
89        assert_eq!(
90            crate::ser::to_string(&PutBucketAccessMonitorParams::default()).unwrap(),
91            "accessmonitor"
92        );
93    }
94
95    #[test]
96    fn body_round_trip() {
97        let cfg = AccessMonitorConfiguration {
98            status: AccessMonitorStatus::Enabled,
99        };
100        let xml = quick_xml::se::to_string(&cfg).unwrap();
101        assert!(xml.contains("<Status>Enabled</Status>"));
102        let back: AccessMonitorConfiguration = quick_xml::de::from_str(&xml).unwrap();
103        assert_eq!(back, cfg);
104    }
105}