1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
use crate::oss;

use self::builders::{
    DeleteBucketWebsiteBuilder, GetBucketWebsiteBuilder, PutBucketWebsiteBuilder,
};

pub mod builders {
    use crate::oss::{
        self,
        api::{self, ApiResponseFrom},
        entities::website::WebsiteConfiguration,
        http,
    };

    pub struct PutBucketWebsiteBuilder<'a> {
        client: &'a oss::Client<'a>,
        config: WebsiteConfiguration,
    }

    impl<'a> PutBucketWebsiteBuilder<'a> {
        pub(crate) fn new(client: &'a oss::Client) -> Self {
            Self {
                client,
                config: WebsiteConfiguration::default(),
            }
        }

        pub fn with_config(mut self, config: WebsiteConfiguration) -> Self {
            self.config = config;
            self
        }

        pub fn config(&self) -> String {
            quick_xml::se::to_string(&self.config).unwrap()
        }

        pub async fn execute(&self) -> api::ApiResult<()> {
            let res = format!("/{}/?{}", self.client.bucket(), "website");
            let url = format!("{}/?{}", self.client.base_url(), "website");

            let config = self.config();
            let data = oss::Bytes::from(config);

            let resp = self
                .client
                .request
                .task()
                .with_url(&url)
                .with_method(http::Method::PUT)
                .with_resource(&res)
                .with_body(data)
                .execute()
                .await?;

            Ok(ApiResponseFrom(resp).to_empty().await)
        }
    }

    pub struct GetBucketWebsiteBuilder<'a> {
        client: &'a oss::Client<'a>,
    }

    impl<'a> GetBucketWebsiteBuilder<'a> {
        pub(crate) fn new(client: &'a oss::Client) -> Self {
            Self { client }
        }

        pub async fn execute(&self) -> api::ApiResult<WebsiteConfiguration> {
            let res = format!("/{}/?{}", self.client.bucket(), "website");
            let url = format!("{}/?{}", self.client.base_url(), "website");
            let resp = self
                .client
                .request
                .task()
                .with_url(&url)
                .with_resource(&res)
                .execute()
                .await?;
            Ok(ApiResponseFrom(resp).to_type().await)
        }
    }

    pub struct DeleteBucketWebsiteBuilder<'a> {
        client: &'a oss::Client<'a>,
    }

    impl<'a> DeleteBucketWebsiteBuilder<'a> {
        pub(crate) fn new(client: &'a oss::Client) -> Self {
            Self { client }
        }

        pub async fn execute(&self) -> api::ApiResult {
            let res = format!("/{}/?{}", self.client.bucket(), "website");
            let url = format!("{}/?{}", self.client.base_url(), "website");
            let resp = self
                .client
                .request
                .task()
                .with_url(&url)
                .with_method(http::Method::DELETE)
                .with_resource(&res)
                .execute()
                .await?;
            Ok(ApiResponseFrom(resp).to_empty().await)
        }
    }
}

/// # 静态网站`Website``
#[allow(non_snake_case)]
impl<'a> oss::Client<'a> {
    /// 调用PutBucketWebsite接口将存储空间`Bucket`设置为静态网站托管模式并设置跳
    /// 转规则`RoutingRule`。
    ///
    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/putbucketwebsite)
    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_website_put.rs)
    pub fn PutBucketWebsite(&self) -> PutBucketWebsiteBuilder {
        PutBucketWebsiteBuilder::new(self)
    }

    /// 调用GetBucketWebsite接口查看存储空间`Bucket`的静态网站托管状态以及跳转规则
    ///
    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/getbucketwebsite)
    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_website_get.rs)
    pub fn GetBucketWebsite(&self) -> GetBucketWebsiteBuilder {
        GetBucketWebsiteBuilder::new(self)
    }

    /// DeleteBucketWebsite接口用于关闭存储空间`Bucket`的静态网站托管模式以及
    /// 跳转规则。只有Bucket的拥有者才能关闭Bucket的静态网站托管模式。
    ///
    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/deletebucketwebsite)
    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_website_del.rs)
    pub fn DeleteBucketWebsite(&self) -> DeleteBucketWebsiteBuilder {
        DeleteBucketWebsiteBuilder::new(self)
    }
}