Skip to main content

rusty_cdk_core/cloudfront/
dto.rs

1use crate::s3::BucketPolicy;
2use crate::shared::Id;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use crate::{dto_methods, ref_struct};
6
7#[derive(Debug, Serialize, Deserialize)]
8pub(crate) enum OriginAccessControlDtoType {
9    #[serde(rename = "AWS::CloudFront::OriginAccessControl")]
10    OriginAccessControlType
11}
12
13ref_struct!(OriginAccessControlRef);
14
15#[derive(Debug, Serialize, Deserialize)]
16pub struct OriginAccessControl {
17    #[serde(skip)]
18    pub(super) id: Id,
19    #[serde(skip)]
20    pub(super) resource_id: String,
21    #[serde(rename = "Type")]
22    pub(super) r#type: OriginAccessControlDtoType,
23    #[serde(rename = "Properties")]
24    pub(super) properties: OriginControlProperties,
25}
26dto_methods!(OriginAccessControl);
27
28#[derive(Debug, Serialize, Deserialize)]
29pub struct OriginControlProperties {
30    #[serde(rename = "OriginAccessControlConfig")]
31    pub(super) config: OriginAccessControlConfig,
32}
33
34#[derive(Debug, Serialize, Deserialize)]
35pub struct OriginAccessControlConfig {
36    #[serde(rename = "Name")]
37    pub(super) name: String,
38    #[serde(rename = "OriginAccessControlOriginType")]
39    pub(super) origin_access_control_type: String,
40    #[serde(rename = "SigningBehavior")]
41    pub(super) signing_behavior: String,
42    #[serde(rename = "SigningProtocol")]
43    pub(super) signing_protocol: String,
44}
45
46#[derive(Debug, Serialize, Deserialize)]
47pub(crate) enum CachePolicyType {
48    #[serde(rename = "AWS::CloudFront::CachePolicy")]
49    CachePolicyType
50}
51
52ref_struct!(CachePolicyRef);
53
54#[derive(Debug, Serialize, Deserialize)]
55pub struct CachePolicy {
56    #[serde(skip)]
57    pub(super) id: Id,
58    #[serde(skip)]
59    pub(super) resource_id: String,
60    #[serde(rename = "Type")]
61    pub(super) r#type: CachePolicyType,
62    #[serde(rename = "Properties")]
63    pub(super) properties: CachePolicyProperties,
64}
65dto_methods!(CachePolicy);
66
67#[derive(Debug, Serialize, Deserialize)]
68pub struct CachePolicyProperties {
69    #[serde(rename = "CachePolicyConfig")]
70    pub(super) config: CachePolicyConfig,
71}
72
73#[derive(Debug, Serialize, Deserialize)]
74pub struct CachePolicyConfig {
75    #[serde(rename = "DefaultTTL")]
76    pub(super) default_ttl: u32,
77    #[serde(rename = "MinTTL")]
78    pub(super) min_ttl: u32,
79    #[serde(rename = "MaxTTL")]
80    pub(super) max_ttl: u32,
81    #[serde(rename = "Name")]
82    pub(super) name: String,
83    #[serde(rename = "ParametersInCacheKeyAndForwardedToOrigin")]
84    pub(super) params_in_cache_key_and_forwarded: ParametersInCacheKeyAndForwardedToOrigin,
85}
86
87#[derive(Debug, Serialize, Deserialize)]
88pub struct ParametersInCacheKeyAndForwardedToOrigin {
89    #[serde(rename = "CookiesConfig")]
90    pub(super) cookies_config: CookiesConfig,
91    #[serde(rename = "EnableAcceptEncodingBrotli", skip_serializing_if = "Option::is_none")]
92    pub(super) accept_encoding_brotli: Option<bool>,
93    #[serde(rename = "EnableAcceptEncodingGzip")]
94    pub(super) accept_encoding_gzip: bool,
95    #[serde(rename = "HeadersConfig")]
96    pub(super) headers_config: HeadersConfig,
97    #[serde(rename = "QueryStringsConfig")]
98    pub(super) query_strings_config: QueryStringsConfig,
99}
100
101#[derive(Debug, Serialize, Deserialize)]
102pub struct HeadersConfig {
103    #[serde(rename = "HeaderBehavior")]
104    pub(super) headers_behavior: String,
105    #[serde(rename = "Headers", skip_serializing_if = "Option::is_none")]
106    pub(super) headers: Option<Vec<String>>,
107}
108
109#[derive(Debug, Serialize, Deserialize)]
110pub struct QueryStringsConfig {
111    #[serde(rename = "QueryStringBehavior")]
112    pub(super) query_strings_behavior: String,
113    #[serde(rename = "QueryStrings", skip_serializing_if = "Option::is_none")]
114    pub(super) query_strings: Option<Vec<String>>,
115}
116
117#[derive(Debug, Serialize, Deserialize)]
118pub struct CookiesConfig {
119    #[serde(rename = "CookieBehavior")]
120    pub(super) cookie_behavior: String,
121    #[serde(rename = "Cookies", skip_serializing_if = "Option::is_none")]
122    pub(super) cookies: Option<Vec<String>>,
123}
124
125#[derive(Debug, Serialize, Deserialize)]
126pub(crate) enum DistributionType {
127    #[serde(rename = "AWS::CloudFront::Distribution")]
128    DistributionType
129}
130
131ref_struct!(DistributionRef);
132
133#[derive(Debug, Serialize, Deserialize)]
134pub struct Distribution {
135    #[serde(skip)]
136    pub(super) id: Id,
137    #[serde(skip)]
138    pub(super) resource_id: String,
139    #[serde(rename = "Type")]
140    pub(super) r#type: DistributionType,
141    #[serde(rename = "Properties")]
142    pub(super) properties: DistributionProperties,
143}
144dto_methods!(Distribution);
145
146#[derive(Debug, Serialize, Deserialize)]
147pub struct DistributionProperties {
148    #[serde(rename = "DistributionConfig")]
149    pub(super) config: DistributionConfig,
150}
151
152#[derive(Debug, Serialize, Deserialize)]
153pub struct DistributionConfig {
154    #[serde(rename = "Aliases", skip_serializing_if = "Option::is_none")]
155    pub(super) aliases: Option<Vec<String>>, // probably can limit possible values this further
156    #[serde(rename = "CacheBehaviors", skip_serializing_if = "Option::is_none")]
157    pub(super) cache_behaviors: Option<Vec<CacheBehavior>>,
158    #[serde(rename = "CNAMEs", skip_serializing_if = "Option::is_none")]
159    pub(super) cnames: Option<Vec<String>>,
160    #[serde(rename = "DefaultCacheBehavior")]
161    pub(super) default_cache_behavior: DefaultCacheBehavior,
162    #[serde(rename = "DefaultRootObject")]
163    pub(super) default_root_object: String,
164    #[serde(rename = "Enabled")]
165    pub(super) enabled: bool,
166    #[serde(rename = "HttpVersion", skip_serializing_if = "Option::is_none")]
167    pub(super) http_version: Option<String>,
168    #[serde(rename = "IPV6Enabled", skip_serializing_if = "Option::is_none")]
169    pub(super) ipv6_enabled: Option<bool>,
170    #[serde(rename = "OriginGroups", skip_serializing_if = "Option::is_none")]
171    pub(super) origin_groups: Option<OriginGroups>,
172    #[serde(rename = "Origins", skip_serializing_if = "Option::is_none")]
173    pub(super) origins: Option<Vec<Origin>>,
174    #[serde(rename = "PriceClass", skip_serializing_if = "Option::is_none")]
175    pub(super) price_class: Option<String>,
176    #[serde(rename = "ViewerCertificate", skip_serializing_if = "Option::is_none")]
177    pub(super) viewer_certificate: Option<ViewerCertificate>,
178    // "Restrictions" : Restrictions,
179    // "Logging" : Logging,
180    // "ConnectionMode" : String,
181    // "ContinuousDeploymentPolicyId" : String,
182    // "CustomErrorResponses" : [ CustomErrorResponse, ... ],
183    // "TenantConfig" : TenantConfig,
184    // "Staging" : Boolean,
185    // "WebACLId" : String
186}
187
188#[derive(Debug, Serialize, Deserialize)]
189pub struct ViewerCertificate {
190    #[serde(rename = "AcmCertificateArn", skip_serializing_if = "Option::is_none")]
191    pub(super) acm_cert_arn: Option<String>,
192    #[serde(rename = "CloudFrontDefaultCertificate", skip_serializing_if = "Option::is_none")]
193    pub(super) cloudfront_default_cert: Option<bool>,
194    #[serde(rename = "IamCertificateId", skip_serializing_if = "Option::is_none")]
195    pub(super) iam_cert_id: Option<String>,
196    #[serde(rename = "MinimumProtocolVersion", skip_serializing_if = "Option::is_none")]
197    pub(super) min_protocol_version: Option<String>,
198    #[serde(rename = "SslSupportMethod", skip_serializing_if = "Option::is_none")]
199    pub(super) ssl_support_method: Option<String>,
200}
201
202#[derive(Debug, Serialize, Deserialize)]
203pub struct OriginGroups {
204    #[serde(rename = "Items")]
205    pub(super) items: Vec<OriginGroup>,
206    #[serde(rename = "Quantity")]
207    pub(super) quantity: u32,
208}
209
210#[derive(Debug, Serialize, Deserialize)]
211pub struct OriginGroup {
212    #[serde(rename = "Id")]
213    pub(super) id: String,
214    #[serde(rename = "FailoverCriteria")]
215    pub(super) fail_over_criteria: FailOverCriteria,
216    #[serde(rename = "Members")]
217    pub(super) members: OriginGroupMembers,
218    #[serde(rename = "SelectionCriteria", skip_serializing_if = "Option::is_none")]
219    pub(super) selection_criteria: Option<String>,
220}
221
222#[derive(Debug, Serialize, Deserialize)]
223pub struct OriginGroupMembers {
224    #[serde(rename = "Items")]
225    pub(super) items: Vec<u32>, // exactly two
226    #[serde(rename = "Quantity")]
227    pub(super) quantity: u32,
228}
229
230#[derive(Debug, Serialize, Deserialize)]
231pub struct OriginGroupMember {
232    #[serde(rename = "OriginId")]
233    pub(super) origin_id: String,
234}
235
236#[derive(Debug, Serialize, Deserialize)]
237// TODO add builder
238pub struct FailOverCriteria {
239    #[serde(rename = "StatusCodes")]
240    pub(super) status_codes: StatusCodes,
241}
242
243#[derive(Debug, Serialize, Deserialize)]
244pub struct StatusCodes {
245    #[serde(rename = "Items")]
246    pub(super) items: Vec<u32>, // min 1
247    #[serde(rename = "Quantity")]
248    pub(super) quantity: u32,
249}
250
251// should have AN origin
252#[derive(Debug, Serialize, Deserialize)]
253pub struct Origin {
254    #[serde(rename = "Id")]
255    pub(super) id: String,
256    #[serde(skip)]
257    pub(super) s3_bucket_policy: Option<BucketPolicy>,
258    #[serde(rename = "DomainName")]
259    pub(super) domain_name: Value,
260    #[serde(rename = "ConnectionAttempts", skip_serializing_if = "Option::is_none")]
261    pub(super) connection_attempts: Option<u8>,
262    #[serde(rename = "ConnectionTimeout", skip_serializing_if = "Option::is_none")]
263    pub(super) connection_timeout: Option<u16>,
264    #[serde(rename = "OriginAccessControlId", skip_serializing_if = "Option::is_none")]
265    pub(super) origin_access_control_id: Option<Value>,
266    #[serde(rename = "OriginPath", skip_serializing_if = "Option::is_none")]
267    pub(super) origin_path: Option<String>,
268    #[serde(rename = "ResponseCompletionTimeout", skip_serializing_if = "Option::is_none")]
269    pub(super) response_completion_timeout: Option<u16>,
270    #[serde(rename = "S3OriginConfig", skip_serializing_if = "Option::is_none")]
271    pub(super) s3origin_config: Option<S3OriginConfig>,
272    #[serde(rename = "OriginCustomHeaders", skip_serializing_if = "Option::is_none")]
273    pub(super) origin_custom_headers: Option<Vec<OriginCustomHeader>>,
274    #[serde(rename = "VpcOriginConfig", skip_serializing_if = "Option::is_none")]
275    pub(super) vpc_origin_config: Option<VpcOriginConfig>,
276    #[serde(rename = "CustomOriginConfig", skip_serializing_if = "Option::is_none")]
277    pub(super) custom_origin_config: Option<CustomOriginConfig>,
278    // "OriginShield"
279}
280
281impl Origin {
282    pub fn get_origin_id(&self) -> &str {
283        self.id.as_str()
284    }
285}
286
287#[derive(Debug, Serialize, Deserialize)]
288pub struct OriginCustomHeader {
289    #[serde(rename = "HeaderName")]
290    pub(super) header_name: String,
291    #[serde(rename = "HeaderValue")]
292    pub(super) header_value: String,
293}
294
295#[derive(Debug, Serialize, Deserialize)]
296pub struct VpcOriginConfig {
297    #[serde(rename = "VpcOriginId")]
298    pub(super) vpc_origin_id: String,
299    #[serde(rename = "OriginKeepaliveTimeout", skip_serializing_if = "Option::is_none")]
300    pub(super) origin_keep_alive_timeout: Option<u32>, // 1-5
301    #[serde(rename = "OriginReadTimeout", skip_serializing_if = "Option::is_none")]
302    pub(super) origin_read_timeout: Option<u32>, // 1-120
303    #[serde(rename = "OwnerAccountId", skip_serializing_if = "Option::is_none")]
304    pub(super) owner_account_id: Option<String>,
305}
306
307
308#[derive(Debug, Serialize, Deserialize)]
309pub struct CustomOriginConfig {
310    #[serde(rename = "OriginProtocolPolicy")]
311    pub(super) origin_protocol_policy: String, // http-only | match-viewer | https-only
312    #[serde(rename = "HTTPPort", skip_serializing_if = "Option::is_none")]
313    pub(super) http_port: Option<u16>,
314    #[serde(rename = "HTTPSPort", skip_serializing_if = "Option::is_none")]
315    pub(super) https_port: Option<u16>,
316    #[serde(rename = "IpAddressType", skip_serializing_if = "Option::is_none")]
317    pub(super) ip_address_type: Option<String>, // ipv4 | ipv6 | dualstack
318    #[serde(rename = "OriginKeepaliveTimeout", skip_serializing_if = "Option::is_none")]
319    pub(super) origin_keep_alive_timeout: Option<u8>, // 1 - 120
320    #[serde(rename = "OriginReadTimeout", skip_serializing_if = "Option::is_none")]
321    pub(super) origin_read_timeout: Option<u8>, // 1 - 120
322    #[serde(rename = "OriginSSLProtocols", skip_serializing_if = "Option::is_none")]
323    pub(super) origin_ssl_protocols: Option<Vec<String>>,
324}
325
326#[derive(Debug, Serialize, Deserialize)]
327pub struct S3OriginConfig {
328    #[serde(rename = "OriginReadTimeout", skip_serializing_if = "Option::is_none")]
329    pub(super) origin_read_timeout: Option<u8>,
330}
331
332#[derive(Debug, Serialize, Deserialize)]
333pub struct DefaultCacheBehavior {
334    // did not add deprecated fields like MaxTTL //
335    #[serde(rename = "TargetOriginId")]
336    pub(super) target_origin_id: String,
337    #[serde(rename = "CachePolicyId")]
338    pub(super) cache_policy_id: Value,
339    #[serde(rename = "ViewerProtocolPolicy")]
340    pub(super) viewer_protocol_policy: String,
341    #[serde(rename = "AllowedMethods", skip_serializing_if = "Option::is_none")]
342    pub(super) allowed_methods: Option<Vec<String>>,
343    #[serde(rename = "CachedMethods", skip_serializing_if = "Option::is_none")]
344    pub(super) cached_methods: Option<Vec<String>>,
345    #[serde(rename = "Compress", skip_serializing_if = "Option::is_none")]
346    pub(super) compress: Option<bool>,
347    // #[serde(rename = "TrustedKeyGroups", skip_serializing_if = "Option::is_none")]
348    // pub(super) trusted_key_groups: Option<Vec<String>>,
349    // "RealtimeLogConfigArn" : String,
350    // "GrpcConfig" : GrpcConfig, => Update your distribution's cache behavior to allow HTTP methods, including the POST method; Specify HTTP/2 as one of the supported HTTP versions.
351    // "OriginRequestPolicyId" : String,
352    // "LambdaFunctionAssociations" : [ LambdaFunctionAssociation, ... ],
353    // "FunctionAssociations" : [ FunctionAssociation, ... ],
354    // "FieldLevelEncryptionId" : String,
355    // "ResponseHeadersPolicyId" : String,
356    // "SmoothStreaming" : Boolean,
357}
358
359#[derive(Debug, Serialize, Deserialize)]
360pub struct CacheBehavior {
361    #[serde(rename = "PathPattern")]
362    pub(super) path_pattern: String,
363    #[serde(rename = "TargetOriginId")]
364    pub(super) target_origin_id: String,
365    #[serde(rename = "CachePolicyId")]
366    pub(super) cache_policy_id: String,
367    #[serde(rename = "ViewerProtocolPolicy")]
368    pub(super) viewer_protocol_policy: String,
369    #[serde(rename = "AllowedMethods", skip_serializing_if = "Option::is_none")]
370    pub(super) allowed_methods: Option<Vec<String>>,
371    #[serde(rename = "CachedMethods", skip_serializing_if = "Option::is_none")]
372    pub(super) cached_methods: Option<Vec<String>>,
373    #[serde(rename = "Compress", skip_serializing_if = "Option::is_none")]
374    pub(super) compress: Option<bool>,
375    #[serde(rename = "TrustedKeyGroups", skip_serializing_if = "Option::is_none")]
376    pub(super) trusted_key_groups: Option<Vec<String>>,
377    // "RealtimeLogConfigArn" : String,
378    // "GrpcConfig" : GrpcConfig,
379    // "OriginRequestPolicyId" : String,
380    // "LambdaFunctionAssociations" : [ LambdaFunctionAssociation, ... ],
381    // "FunctionAssociations" : [ FunctionAssociation, ... ],
382    // "FieldLevelEncryptionId" : String,
383    // "ResponseHeadersPolicyId" : String,
384    // "SmoothStreaming" : Boolean,
385}