Skip to main content

s3_wire/client/
mod.rs

1//! S3 client implementation.
2
3mod multipart;
4mod multipart_upload;
5mod object;
6mod presign;
7mod request;
8
9#[cfg(feature = "fuzzing")]
10pub(crate) use multipart_upload::effective_concurrency;
11
12use std::fmt;
13use std::sync::Arc;
14
15use crate::config::S3Config;
16use crate::error::S3Error;
17use crate::transport::Transport;
18
19struct ClientInner {
20    config: S3Config,
21    transport: Transport,
22}
23
24/// An async S3-compatible client.
25#[derive(Clone)]
26pub struct S3Client {
27    inner: Arc<ClientInner>,
28}
29
30impl S3Client {
31    /// Constructs a client from validated configuration.
32    pub fn new(config: S3Config) -> Result<Self, S3Error> {
33        let transport = Transport::new(
34            config.connect_timeout(),
35            config.user_agent(),
36            !config.endpoint().is_https(),
37        )?;
38        Ok(Self {
39            inner: Arc::new(ClientInner { config, transport }),
40        })
41    }
42
43    /// Returns this client's validated configuration.
44    pub fn config(&self) -> &S3Config {
45        &self.inner.config
46    }
47}
48
49impl fmt::Debug for S3Client {
50    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
51        formatter
52            .debug_struct("S3Client")
53            .field("config", &self.inner.config)
54            .finish_non_exhaustive()
55    }
56}