rusty_s3/actions/
delete_bucket.rs

1use std::time::Duration;
2
3use jiff::Timestamp;
4use url::Url;
5
6use crate::actions::Method;
7use crate::actions::S3Action;
8use crate::signing::sign;
9use crate::{Bucket, Credentials, Map};
10
11/// Delete a bucket.
12///
13/// The bucket must be empty before it can be deleted.
14///
15/// Find out more about `DeleteBucket` from the [AWS API Reference][api]
16///
17/// [api]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html
18#[derive(Debug, Clone)]
19pub struct DeleteBucket<'a> {
20    bucket: &'a Bucket,
21    credentials: &'a Credentials,
22
23    query: Map<'a>,
24    headers: Map<'a>,
25}
26
27impl<'a> DeleteBucket<'a> {
28    #[must_use]
29    pub const fn new(bucket: &'a Bucket, credentials: &'a Credentials) -> Self {
30        Self {
31            bucket,
32            credentials,
33
34            query: Map::new(),
35            headers: Map::new(),
36        }
37    }
38}
39
40impl<'a> S3Action<'a> for DeleteBucket<'a> {
41    const METHOD: Method = Method::Delete;
42
43    fn query_mut(&mut self) -> &mut Map<'a> {
44        &mut self.query
45    }
46
47    fn headers_mut(&mut self) -> &mut Map<'a> {
48        &mut self.headers
49    }
50
51    fn sign_with_time(&self, expires_in: Duration, time: &Timestamp) -> Url {
52        let url = self.bucket.base_url().clone();
53
54        sign(
55            time,
56            Self::METHOD,
57            url,
58            self.credentials.key(),
59            self.credentials.secret(),
60            self.credentials.token(),
61            self.bucket.region(),
62            expires_in.as_secs(),
63            self.query.iter(),
64            self.headers.iter(),
65        )
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use pretty_assertions::assert_eq;
72
73    use super::*;
74    use crate::{Bucket, Credentials, UrlStyle};
75
76    #[test]
77    fn aws_example() {
78        // Fri, 24 May 2013 00:00:00 GMT
79        let date = Timestamp::from_second(1369353600).unwrap();
80        let expires_in = Duration::from_secs(86400);
81
82        let endpoint = "https://s3.amazonaws.com".parse().unwrap();
83        let bucket = Bucket::new(
84            endpoint,
85            UrlStyle::VirtualHost,
86            "examplebucket",
87            "us-east-1",
88        )
89        .unwrap();
90        let credentials = Credentials::new(
91            "AKIAIOSFODNN7EXAMPLE",
92            "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
93        );
94
95        let action = DeleteBucket::new(&bucket, &credentials);
96
97        let url = action.sign_with_time(expires_in, &date);
98        let expected = "https://examplebucket.s3.amazonaws.com/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=875ca449635876849f9cf1622dc709f1978d82e7f6e067b173e6212e3850a1e9";
99
100        assert_eq!(expected, url.as_str());
101    }
102}