cf_r2_sdk/
builder.rs

1use crate::{error::BuilderError, operator::Operator};
2use aws_sdk_s3::config::{
3    Credentials, Region, RequestChecksumCalculation, ResponseChecksumValidation,
4};
5
6/// Builder for creating a new [Operator] instance.
7///
8/// # Example
9///
10/// ```
11/// use cf_r2_sdk::builder::Builder;
12/// use cf_r2_sdk::error::Error;
13/// use dotenvy::dotenv;
14/// use std::env;
15///
16/// #[tokio::main(flavor = "current_thread")]
17/// async fn main() -> Result<(), Error> {
18///    // load .env file
19///    dotenv().expect(".env file not found.");
20///    // insert a environment variable
21///    let bucket_name = env::var("BUCKET_NAME").expect("BUCKET_NAME not found in .env file.");
22///    let endpoint_url: String =
23///        env::var("ENDPOINT_URL").expect("ENDPOINT_URL not found in .env file.");
24///    let access_key_id: String =
25///        env::var("ACCESS_KEY_ID").expect("ACCESS_KEY_ID not found in .env file.");
26///    let secret_access_key: String =
27///       env::var("SECRET_ACCESS_KEY").expect("SECRET_ACCESS_KEY not found in .env file.");
28///    let region: String = env::var("REGION").expect("REGION not found in .env file.");
29///
30///    let object: cf_r2_sdk::operator::Operator = Builder::new()
31///        .set_bucket_name(bucket_name)
32///        .set_access_key_id(access_key_id)
33///        .set_secret_access_key(secret_access_key)
34///        .set_endpoint(endpoint_url)
35///        .set_region(region)
36///        .create_client_result()?;
37///    Ok(())
38/// }
39/// ```
40#[derive(Debug, Clone)]
41pub struct Builder {
42    bucket_name: Option<String>,
43    access_key_id: Option<String>,
44    secret_access_key: Option<String>,
45    endpoint: Option<String>,
46    region: String,
47}
48
49impl Default for Builder {
50    fn default() -> Self {
51        Self {
52            bucket_name: None,
53            access_key_id: None,
54            secret_access_key: None,
55            endpoint: None,
56            region: "auto".to_string(),
57        }
58    }
59}
60
61impl Builder {
62    pub fn new() -> Self {
63        //! Create a new [Builder] instance with default values.
64        //!
65        //! default value of region is "auto".
66        Self::default()
67    }
68
69    pub fn set_bucket_name(mut self, bucket_name: String) -> Self {
70        //! Set the bucket name.
71        self.bucket_name = Some(bucket_name);
72        self
73    }
74
75    pub fn set_access_key_id(mut self, access_key_id: String) -> Self {
76        //! Set the access key id.
77        self.access_key_id = Some(access_key_id);
78        self
79    }
80
81    pub fn set_secret_access_key(mut self, secret_access_key: String) -> Self {
82        //! Set the secret access key.
83        self.secret_access_key = Some(secret_access_key);
84        self
85    }
86
87    pub fn set_endpoint(mut self, endpoint: String) -> Self {
88        //! Set the endpoint.
89        self.endpoint = Some(endpoint);
90        self
91    }
92
93    pub fn set_region(mut self, region: String) -> Self {
94        //! Set the region.
95        self.region = region;
96        self
97    }
98
99    #[deprecated(since = "3.1.0", note = "use create_client_result() instead")]
100    pub fn create_client(&self) -> Operator {
101        //! Create a new [Operator] instance.
102        let credentials = Credentials::new(
103            self.access_key_id
104                .as_ref()
105                .expect("Access key id is not set."),
106            self.secret_access_key
107                .as_ref()
108                .expect("Secret access key is not set."),
109            None,
110            None,
111            "",
112        );
113
114        let config = aws_sdk_s3::config::Builder::new()
115            .credentials_provider(credentials)
116            .region(Region::new(self.region.clone()))
117            .endpoint_url(self.endpoint.as_ref().expect("Endpoint is not set."))
118            .set_request_checksum_calculation(Some(RequestChecksumCalculation::WhenRequired))
119            .set_response_checksum_validation(Some(ResponseChecksumValidation::WhenRequired))
120            .clone()
121            .build();
122
123        Operator::new(
124            self.bucket_name.clone().expect("Bucket name is not set."),
125            aws_sdk_s3::Client::from_conf(config),
126        )
127    }
128
129    pub fn create_client_result(&self) -> Result<Operator, BuilderError> {
130        //! Create a new [Operator] instance.
131        let bucket_name = match &self.bucket_name {
132            Some(bucket_name) => bucket_name.clone(),
133            None => Err(BuilderError::BucketNameNotSetError)?,
134        };
135        let access_key_id = match &self.access_key_id {
136            Some(access_key_id) => access_key_id,
137            None => Err(BuilderError::AccessKeyIdNotSetError)?,
138        };
139        let secret_access_key = match &self.secret_access_key {
140            Some(secret_access_key) => secret_access_key,
141            None => Err(BuilderError::SecretAccessKeyNotSetError)?,
142        };
143        let endpoint = match &self.endpoint {
144            Some(endpoint) => endpoint,
145            None => Err(BuilderError::EndpointNotSetError)?,
146        };
147
148        let credentials = Credentials::new(access_key_id, secret_access_key, None, None, "");
149
150        let config = aws_sdk_s3::config::Builder::new()
151            .credentials_provider(credentials)
152            .region(Region::new(self.region.clone()))
153            .endpoint_url(endpoint)
154            .set_request_checksum_calculation(Some(RequestChecksumCalculation::WhenRequired))
155            .set_response_checksum_validation(Some(ResponseChecksumValidation::WhenRequired))
156            .clone()
157            .build();
158
159        Ok(Operator::new(
160            bucket_name,
161            aws_sdk_s3::Client::from_conf(config),
162        ))
163    }
164}