1mod 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#[derive(Clone)]
26pub struct S3Client {
27 inner: Arc<ClientInner>,
28}
29
30impl S3Client {
31 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 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}