rusty_cdk_core/s3/
dto.rs

1use serde::Serialize;
2use serde_json::Value;
3use crate::iam::PolicyDocument;
4use crate::{dto_methods, ref_struct};
5use crate::shared::Id;
6
7ref_struct!(BucketPolicyRef);
8
9#[derive(Debug, Serialize)]
10pub struct BucketPolicy {
11    #[serde(skip)]
12    pub(super) id: Id,
13    #[serde(skip)]
14    pub(super) resource_id: String,
15    #[serde(rename = "Type")]
16    pub(super) r#type: String,
17    #[serde(rename = "Properties")]
18    pub(crate) properties: S3BucketPolicyProperties,
19}
20dto_methods!(BucketPolicy);
21
22#[derive(Debug, Serialize)]
23pub struct S3BucketPolicyProperties {
24    #[serde(rename = "Bucket")]
25    pub(crate) bucket_name: Value,
26    #[serde(rename = "PolicyDocument")]
27    pub(crate) policy_document: PolicyDocument,
28}
29
30ref_struct!(BucketRef);
31
32#[derive(Debug, Serialize)]
33pub struct Bucket {
34    #[serde(skip)]
35    pub(super) id: Id,
36    #[serde(skip)]
37    pub(super) resource_id: String,
38    #[serde(rename = "Type")]
39    pub(super) r#type: String,
40    #[serde(rename = "Properties")]
41    pub(super) properties: BucketProperties,
42}
43dto_methods!(Bucket);
44
45#[derive(Debug, Serialize)]
46pub struct BucketProperties {
47    #[serde(rename = "BucketName", skip_serializing_if = "Option::is_none")]
48    pub(super) bucket_name: Option<String>,
49    #[serde(rename = "BucketEncryption", skip_serializing_if = "Option::is_none")]
50    pub(super) bucket_encryption: Option<BucketEncryption>,
51    #[serde(rename = "CorsConfiguration", skip_serializing_if = "Option::is_none")]
52    pub(super) cors_configuration: Option<CorsConfiguration>,
53    #[serde(rename = "LifecycleConfiguration", skip_serializing_if = "Option::is_none")]
54    pub(super) lifecycle_configuration: Option<LifecycleConfiguration>,
55    #[serde(rename = "NotificationConfiguration", skip_serializing_if = "Option::is_none")]
56    pub(super) notification_configuration: Option<NotificationConfiguration>,
57    #[serde(rename = "PublicAccessBlockConfiguration", skip_serializing_if = "Option::is_none")]
58    pub(super) public_access_block_configuration: Option<PublicAccessBlockConfiguration>,
59    #[serde(rename = "VersioningConfiguration", skip_serializing_if = "Option::is_none")]
60    pub(super) versioning_configuration: Option<VersioningConfig>,
61    #[serde(rename = "WebsiteConfiguration", skip_serializing_if = "Option::is_none")]
62    pub(super) website_configuration: Option<WebsiteConfiguration>,
63}
64
65#[derive(Debug, Serialize)]
66pub struct BucketEncryption {
67    #[serde(rename = "ServerSideEncryptionConfiguration")]
68    pub(super) server_side_encryption_configuration: Vec<ServerSideEncryptionRule>,
69}
70
71#[derive(Debug, Serialize)]
72pub struct ServerSideEncryptionRule {
73    #[serde(rename = "ServerSideEncryptionByDefault")]
74    pub(super) server_side_encryption_by_default: ServerSideEncryptionByDefault,
75    #[serde(rename = "BucketKeyEnabled", skip_serializing_if = "Option::is_none")]
76    pub(super) bucket_key_enabled: Option<bool>,
77}
78
79#[derive(Debug, Serialize)]
80pub struct ServerSideEncryptionByDefault {
81    #[serde(rename = "SSEAlgorithm")]
82    pub(super) sse_algorithm: String,
83    #[serde(rename = "KMSMasterKeyID", skip_serializing_if = "Option::is_none")]
84    pub(super) kms_master_key_id: Option<String>,
85}
86
87#[derive(Debug, Serialize)]
88pub struct CorsConfiguration {
89    #[serde(rename = "CorsRules")]
90    pub(super) cors_rules: Vec<CorsRule>,
91}
92
93#[derive(Debug, Serialize)]
94pub struct CorsRule {
95    #[serde(rename = "AllowedHeaders", skip_serializing_if = "Option::is_none")]
96    pub(super) allowed_headers: Option<Vec<String>>,
97    #[serde(rename = "AllowedMethods")]
98    pub(super) allowed_methods: Vec<String>,
99    #[serde(rename = "AllowedOrigins")]
100    pub(super) allowed_origins: Vec<String>,
101    #[serde(rename = "ExposedHeaders", skip_serializing_if = "Option::is_none")]
102    pub(super) exposed_headers: Option<Vec<String>>,
103    #[serde(rename = "MaxAge", skip_serializing_if = "Option::is_none")]
104    pub(super) max_age: Option<u64>,
105}
106
107#[derive(Debug, Serialize)]
108pub struct LifecycleConfiguration {
109    #[serde(rename = "Rules")]
110    pub(super) rules: Vec<LifecycleRule>,
111    #[serde(rename = "TransitionDefaultMinimumObjectSize", skip_serializing_if = "Option::is_none")]
112    pub(super) transition_minimum_size: Option<String>
113}
114
115#[derive(Debug, Serialize)]
116pub struct LifecycleRuleTransition {
117    #[serde(rename = "StorageClass")]
118    pub(super) storage_class: String,
119    #[serde(rename = "TransitionInDays")]
120    pub(super) transition_in_days: u16, // will become optional once `TransitionDate` is added!
121    // #[serde(rename = "TransitionDate")]
122    // pub(super transition_date: String => add and check the regex
123}
124
125#[derive(Debug, Serialize)]
126pub struct NonCurrentVersionTransition {
127    #[serde(rename = "StorageClass")]
128    pub(super) storage_class: String,
129    #[serde(rename = "TransitionInDays")]
130    pub(super) transition_in_days: u32,
131    #[serde(rename = "NewerNoncurrentVersions")]
132    pub(super) newer_non_current_versions: Option<u32>
133}
134
135#[derive(Debug, Serialize)]
136pub struct LifecycleRule {
137    #[serde(rename = "Id", skip_serializing_if = "Option::is_none")]
138    pub(super) id: Option<String>,
139    #[serde(rename = "Status")]
140    pub(super) status: String,
141    #[serde(rename = "ExpirationInDays", skip_serializing_if = "Option::is_none")]
142    pub(super) expiration_in_days: Option<u16>,
143    #[serde(rename = "Prefix", skip_serializing_if = "Option::is_none")]
144    pub(super) prefix: Option<String>,
145    #[serde(rename = "ObjectSizeGreaterThan", skip_serializing_if = "Option::is_none")]
146    pub(super) object_size_greater_than: Option<u32>,
147    #[serde(rename = "ObjectSizeLessThan", skip_serializing_if = "Option::is_none")]
148    pub(super) object_size_less_than: Option<u32>,
149    #[serde(rename = "AbortIncompleteMultipartUpload", skip_serializing_if = "Option::is_none")]
150    pub(super) abort_incomplete_multipart_upload: Option<u16>,
151    #[serde(rename = "NoncurrentVersionExpiration", skip_serializing_if = "Option::is_none")]
152    pub(super) non_current_version_expiration: Option<u16>,
153    #[serde(rename = "Transitions", skip_serializing_if = "Option::is_none")]
154    pub(super) transitions: Option<Vec<LifecycleRuleTransition>>,
155    #[serde(rename = "NoncurrentVersionTransitions", skip_serializing_if = "Option::is_none")]
156    pub(super) non_current_version_transitions: Option<Vec<NonCurrentVersionTransition>>
157    // #[serde(rename = "ExpiredObjectDeleteMarker", skip_serializing_if = "Option::is_none")]
158    // pub(super expire_object_delete_marker: Option<bool> => cannot be specified with ExpirationInDays, ExpirationDate, or TagFilters.
159    // "ExpirationDate": String => check the regex
160}
161
162#[derive(Debug, Serialize)]
163pub struct NotificationConfiguration {
164    #[serde(rename = "TopicConfigurations", skip_serializing_if = "Option::is_none")]
165    pub(super) topic_configurations: Option<Vec<TopicConfiguration>>,
166    #[serde(rename = "QueueConfigurations", skip_serializing_if = "Option::is_none")]
167    pub(super) queue_configurations: Option<Vec<QueueConfiguration>>, // fifo not allowed!
168    #[serde(rename = "LambdaConfigurations", skip_serializing_if = "Option::is_none")]
169    pub(super) lambda_configurations: Option<Vec<LambdaConfiguration>>,
170}
171
172#[derive(Debug, Serialize)]
173pub struct TopicConfiguration {
174    #[serde(rename = "Event")]
175    pub(super) event: String,
176    #[serde(rename = "Topic")]
177    pub(super) topic: String,
178    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
179    pub(super) filter: Option<NotificationFilter>,
180}
181
182#[derive(Debug, Serialize)]
183pub struct QueueConfiguration {
184    #[serde(rename = "Event")]
185    pub(super) event: String,
186    #[serde(rename = "Queue")]
187    pub(super) queue: String,
188    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
189    pub(super) filter: Option<NotificationFilter>,
190}
191
192#[derive(Debug, Serialize)]
193pub struct LambdaConfiguration {
194    #[serde(rename = "Event")]
195    pub(super) event: String,
196    #[serde(rename = "Function")]
197    pub(super) function: String,
198    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
199    pub(super) filter: Option<NotificationFilter>,
200}
201
202#[derive(Debug, Serialize)]
203pub struct NotificationFilter {
204    #[serde(rename = "S3Key", skip_serializing_if = "Option::is_none")]
205    pub(super) s3_key: Option<S3KeyFilter>,
206}
207
208#[derive(Debug, Serialize)]
209pub struct S3KeyFilter {
210    #[serde(rename = "Rules")]
211    pub(super) rules: Vec<FilterRule>,
212}
213
214#[derive(Debug, Serialize)]
215pub struct FilterRule {
216    #[serde(rename = "Name")]
217    pub(super) name: String,
218    #[serde(rename = "Value")]
219    pub(super) value: String,
220}
221
222#[derive(Debug, Serialize)]
223pub struct PublicAccessBlockConfiguration {
224    #[serde(rename = "BlockPublicAcls", skip_serializing_if = "Option::is_none")]
225    pub(super) block_public_acls: Option<bool>,
226    #[serde(rename = "BlockPublicPolicy", skip_serializing_if = "Option::is_none")]
227    pub(super) block_public_policy: Option<bool>,
228    #[serde(rename = "IgnorePublicAcls", skip_serializing_if = "Option::is_none")]
229    pub(super) ignore_public_acls: Option<bool>,
230    #[serde(rename = "RestrictPublicBuckets", skip_serializing_if = "Option::is_none")]
231    pub(super) restrict_public_buckets: Option<bool>,
232}
233
234#[derive(Debug, Serialize)]
235pub struct VersioningConfig {
236    #[serde(rename = "Status")]
237    pub(super) status: String,
238}
239
240#[derive(Debug, Serialize)]
241pub struct WebsiteConfiguration {
242    #[serde(rename = "IndexDocument", skip_serializing_if = "Option::is_none")]
243    pub(super) index_document: Option<String>,
244    #[serde(rename = "ErrorDocument", skip_serializing_if = "Option::is_none")]
245    pub(super) error_document: Option<String>,
246    #[serde(rename = "RedirectAllRequestsTo", skip_serializing_if = "Option::is_none")]
247    pub(super) redirect_all_requests_to: Option<RedirectAllRequestsTo>,
248}
249
250#[derive(Debug, Serialize)]
251pub struct RedirectAllRequestsTo {
252    #[serde(rename = "HostName")]
253    pub(super) host_name: String,
254    #[serde(rename = "Protocol", skip_serializing_if = "Option::is_none")]
255    pub(super) protocol: Option<String>,
256}