Skip to main content

fakecloud_cloudfront/
model.rs

1//! Serde-modeled CloudFront payload types.
2//!
3//! CloudFront uses XML on the wire with deeply nested optional fields. We
4//! define typed structs that round-trip via `quick-xml` + serde so a
5//! `DistributionConfig` parsed from a `CreateDistribution` body can be
6//! emitted byte-equivalent in a later `GetDistributionConfig`. Everything
7//! that AWS treats as optional is `Option<_>`; lists keep the AWS
8//! `Quantity`/`Items` envelope so SDK readers see the same shape.
9
10use serde::{Deserialize, Serialize};
11
12fn skip_if_none<T>(x: &Option<T>) -> bool {
13    x.is_none()
14}
15
16// ─── DistributionConfig ───────────────────────────────────────────────
17
18#[derive(Debug, Clone, Serialize, Deserialize, Default)]
19#[serde(rename_all = "PascalCase")]
20pub struct DistributionConfig {
21    pub caller_reference: String,
22    #[serde(default, skip_serializing_if = "skip_if_none")]
23    pub aliases: Option<Aliases>,
24    #[serde(default, skip_serializing_if = "skip_if_none")]
25    pub default_root_object: Option<String>,
26    pub origins: Origins,
27    #[serde(default, skip_serializing_if = "skip_if_none")]
28    pub origin_groups: Option<OriginGroups>,
29    pub default_cache_behavior: DefaultCacheBehavior,
30    #[serde(default, skip_serializing_if = "skip_if_none")]
31    pub cache_behaviors: Option<CacheBehaviors>,
32    #[serde(default, skip_serializing_if = "skip_if_none")]
33    pub custom_error_responses: Option<CustomErrorResponses>,
34    pub comment: String,
35    #[serde(default, skip_serializing_if = "skip_if_none")]
36    pub logging: Option<LoggingConfig>,
37    #[serde(default, skip_serializing_if = "skip_if_none")]
38    pub price_class: Option<String>,
39    pub enabled: bool,
40    #[serde(default, skip_serializing_if = "skip_if_none")]
41    pub viewer_certificate: Option<ViewerCertificate>,
42    #[serde(default, skip_serializing_if = "skip_if_none")]
43    pub restrictions: Option<Restrictions>,
44    // AWS spells this `WebACLId` (upper-case ACL). The default PascalCase
45    // rule would emit `WebAclId`, which drops the field on parse from real
46    // SDK requests and mis-names it on the wire. Pin the exact name.
47    #[serde(default, rename = "WebACLId", skip_serializing_if = "skip_if_none")]
48    pub web_acl_id: Option<String>,
49    #[serde(default, skip_serializing_if = "skip_if_none")]
50    pub http_version: Option<String>,
51    #[serde(default, skip_serializing_if = "skip_if_none")]
52    pub is_ipv6_enabled: Option<bool>,
53    #[serde(default, skip_serializing_if = "skip_if_none")]
54    pub continuous_deployment_policy_id: Option<String>,
55    #[serde(default, skip_serializing_if = "skip_if_none")]
56    pub staging: Option<bool>,
57    #[serde(default, skip_serializing_if = "skip_if_none")]
58    pub anycast_ip_list_id: Option<String>,
59    #[serde(default, skip_serializing_if = "skip_if_none")]
60    pub tenant_config: Option<TenantConfig>,
61    #[serde(default, skip_serializing_if = "skip_if_none")]
62    pub connection_mode: Option<String>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, Default)]
66#[serde(rename_all = "PascalCase")]
67pub struct Aliases {
68    pub quantity: i32,
69    #[serde(default, skip_serializing_if = "skip_if_none")]
70    pub items: Option<AliasItems>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, Default)]
74#[serde(rename_all = "PascalCase")]
75pub struct AliasItems {
76    #[serde(default, rename = "CNAME")]
77    pub cname: Vec<String>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize, Default)]
81#[serde(rename_all = "PascalCase")]
82pub struct Origins {
83    pub quantity: i32,
84    #[serde(default, skip_serializing_if = "skip_if_none")]
85    pub items: Option<OriginItems>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, Default)]
89#[serde(rename_all = "PascalCase")]
90pub struct OriginItems {
91    #[serde(default)]
92    pub origin: Vec<Origin>,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize, Default)]
96#[serde(rename_all = "PascalCase")]
97pub struct Origin {
98    pub id: String,
99    pub domain_name: String,
100    #[serde(default, skip_serializing_if = "skip_if_none")]
101    pub origin_path: Option<String>,
102    #[serde(default, skip_serializing_if = "skip_if_none")]
103    pub custom_headers: Option<CustomHeaders>,
104    #[serde(default, skip_serializing_if = "skip_if_none")]
105    pub s3_origin_config: Option<S3OriginConfig>,
106    #[serde(default, skip_serializing_if = "skip_if_none")]
107    pub custom_origin_config: Option<CustomOriginConfig>,
108    #[serde(default, skip_serializing_if = "skip_if_none")]
109    pub vpc_origin_config: Option<VpcOriginConfig>,
110    #[serde(default, skip_serializing_if = "skip_if_none")]
111    pub connection_attempts: Option<i32>,
112    #[serde(default, skip_serializing_if = "skip_if_none")]
113    pub connection_timeout: Option<i32>,
114    #[serde(default, skip_serializing_if = "skip_if_none")]
115    pub origin_shield: Option<OriginShield>,
116    #[serde(default, skip_serializing_if = "skip_if_none")]
117    pub origin_access_control_id: Option<String>,
118    #[serde(default, skip_serializing_if = "skip_if_none")]
119    pub response_completion_timeout: Option<i32>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, Default)]
123#[serde(rename_all = "PascalCase")]
124pub struct CustomHeaders {
125    pub quantity: i32,
126    #[serde(default, skip_serializing_if = "skip_if_none")]
127    pub items: Option<CustomHeaderItems>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize, Default)]
131#[serde(rename_all = "PascalCase")]
132pub struct CustomHeaderItems {
133    #[serde(default)]
134    pub origin_custom_header: Vec<OriginCustomHeader>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize, Default)]
138#[serde(rename_all = "PascalCase")]
139pub struct OriginCustomHeader {
140    pub header_name: String,
141    pub header_value: String,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize, Default)]
145#[serde(rename_all = "PascalCase")]
146pub struct S3OriginConfig {
147    pub origin_access_identity: String,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize, Default)]
151#[serde(rename_all = "PascalCase")]
152pub struct CustomOriginConfig {
153    pub http_port: i32,
154    pub https_port: i32,
155    pub origin_protocol_policy: String,
156    #[serde(default, skip_serializing_if = "skip_if_none")]
157    pub origin_ssl_protocols: Option<OriginSslProtocols>,
158    #[serde(default, skip_serializing_if = "skip_if_none")]
159    pub origin_read_timeout: Option<i32>,
160    #[serde(default, skip_serializing_if = "skip_if_none")]
161    pub origin_keepalive_timeout: Option<i32>,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, Default)]
165#[serde(rename_all = "PascalCase")]
166pub struct OriginSslProtocols {
167    pub quantity: i32,
168    pub items: SslProtocolItems,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, Default)]
172#[serde(rename_all = "PascalCase")]
173pub struct SslProtocolItems {
174    #[serde(default, rename = "SslProtocol")]
175    pub ssl_protocol: Vec<String>,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, Default)]
179#[serde(rename_all = "PascalCase")]
180pub struct VpcOriginConfig {
181    pub vpc_origin_id: String,
182    #[serde(default, skip_serializing_if = "skip_if_none")]
183    pub origin_read_timeout: Option<i32>,
184    #[serde(default, skip_serializing_if = "skip_if_none")]
185    pub origin_keepalive_timeout: Option<i32>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize, Default)]
189#[serde(rename_all = "PascalCase")]
190pub struct OriginShield {
191    pub enabled: bool,
192    #[serde(default, skip_serializing_if = "skip_if_none")]
193    pub origin_shield_region: Option<String>,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize, Default)]
197#[serde(rename_all = "PascalCase")]
198pub struct OriginGroups {
199    pub quantity: i32,
200    #[serde(default, skip_serializing_if = "skip_if_none")]
201    pub items: Option<OriginGroupItems>,
202}
203
204#[derive(Debug, Clone, Serialize, Deserialize, Default)]
205#[serde(rename_all = "PascalCase")]
206pub struct OriginGroupItems {
207    #[serde(default)]
208    pub origin_group: Vec<OriginGroup>,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize, Default)]
212#[serde(rename_all = "PascalCase")]
213pub struct OriginGroup {
214    pub id: String,
215    pub failover_criteria: OriginGroupFailoverCriteria,
216    pub members: OriginGroupMembers,
217    #[serde(default, skip_serializing_if = "skip_if_none")]
218    pub selection_criteria: Option<String>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize, Default)]
222#[serde(rename_all = "PascalCase")]
223pub struct OriginGroupFailoverCriteria {
224    pub status_codes: StatusCodes,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize, Default)]
228#[serde(rename_all = "PascalCase")]
229pub struct StatusCodes {
230    pub quantity: i32,
231    pub items: StatusCodeItems,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize, Default)]
235#[serde(rename_all = "PascalCase")]
236pub struct StatusCodeItems {
237    #[serde(default, rename = "StatusCode")]
238    pub status_code: Vec<i32>,
239}
240
241#[derive(Debug, Clone, Serialize, Deserialize, Default)]
242#[serde(rename_all = "PascalCase")]
243pub struct OriginGroupMembers {
244    pub quantity: i32,
245    pub items: OriginGroupMemberItems,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize, Default)]
249#[serde(rename_all = "PascalCase")]
250pub struct OriginGroupMemberItems {
251    #[serde(default)]
252    pub origin_group_member: Vec<OriginGroupMember>,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize, Default)]
256#[serde(rename_all = "PascalCase")]
257pub struct OriginGroupMember {
258    pub origin_id: String,
259}
260
261#[derive(Debug, Clone, Serialize, Deserialize, Default)]
262#[serde(rename_all = "PascalCase")]
263pub struct DefaultCacheBehavior {
264    pub target_origin_id: String,
265    #[serde(default, skip_serializing_if = "skip_if_none")]
266    pub trusted_signers: Option<TrustedSigners>,
267    #[serde(default, skip_serializing_if = "skip_if_none")]
268    pub trusted_key_groups: Option<TrustedKeyGroups>,
269    pub viewer_protocol_policy: String,
270    #[serde(default, skip_serializing_if = "skip_if_none")]
271    pub allowed_methods: Option<AllowedMethods>,
272    #[serde(default, skip_serializing_if = "skip_if_none")]
273    pub smooth_streaming: Option<bool>,
274    #[serde(default, skip_serializing_if = "skip_if_none")]
275    pub compress: Option<bool>,
276    #[serde(default, skip_serializing_if = "skip_if_none")]
277    pub lambda_function_associations: Option<LambdaFunctionAssociations>,
278    #[serde(default, skip_serializing_if = "skip_if_none")]
279    pub function_associations: Option<FunctionAssociations>,
280    #[serde(default, skip_serializing_if = "skip_if_none")]
281    pub field_level_encryption_id: Option<String>,
282    #[serde(default, skip_serializing_if = "skip_if_none")]
283    pub realtime_log_config_arn: Option<String>,
284    #[serde(default, skip_serializing_if = "skip_if_none")]
285    pub cache_policy_id: Option<String>,
286    #[serde(default, skip_serializing_if = "skip_if_none")]
287    pub origin_request_policy_id: Option<String>,
288    #[serde(default, skip_serializing_if = "skip_if_none")]
289    pub response_headers_policy_id: Option<String>,
290    #[serde(default, skip_serializing_if = "skip_if_none")]
291    pub grpc_config: Option<GrpcConfig>,
292    #[serde(default, skip_serializing_if = "skip_if_none")]
293    pub forwarded_values: Option<ForwardedValues>,
294    #[serde(default, skip_serializing_if = "skip_if_none")]
295    pub min_ttl: Option<i64>,
296    #[serde(default, skip_serializing_if = "skip_if_none")]
297    pub default_ttl: Option<i64>,
298    #[serde(default, skip_serializing_if = "skip_if_none")]
299    pub max_ttl: Option<i64>,
300}
301
302#[derive(Debug, Clone, Serialize, Deserialize, Default)]
303#[serde(rename_all = "PascalCase")]
304pub struct TrustedSigners {
305    pub enabled: bool,
306    pub quantity: i32,
307    #[serde(default, skip_serializing_if = "skip_if_none")]
308    pub items: Option<AwsAccountNumberList>,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize, Default)]
312#[serde(rename_all = "PascalCase")]
313pub struct AwsAccountNumberList {
314    #[serde(default, rename = "AwsAccountNumber")]
315    pub aws_account_number: Vec<String>,
316}
317
318#[derive(Debug, Clone, Serialize, Deserialize, Default)]
319#[serde(rename_all = "PascalCase")]
320pub struct TrustedKeyGroups {
321    pub enabled: bool,
322    pub quantity: i32,
323    #[serde(default, skip_serializing_if = "skip_if_none")]
324    pub items: Option<TrustedKeyGroupIdList>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize, Default)]
328#[serde(rename_all = "PascalCase")]
329pub struct TrustedKeyGroupIdList {
330    #[serde(default, rename = "KeyGroup")]
331    pub key_group: Vec<String>,
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize, Default)]
335#[serde(rename_all = "PascalCase")]
336pub struct AllowedMethods {
337    pub quantity: i32,
338    pub items: MethodList,
339    #[serde(default, skip_serializing_if = "skip_if_none")]
340    pub cached_methods: Option<CachedMethods>,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize, Default)]
344#[serde(rename_all = "PascalCase")]
345pub struct MethodList {
346    #[serde(default, rename = "Method")]
347    pub method: Vec<String>,
348}
349
350#[derive(Debug, Clone, Serialize, Deserialize, Default)]
351#[serde(rename_all = "PascalCase")]
352pub struct CachedMethods {
353    pub quantity: i32,
354    pub items: MethodList,
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize, Default)]
358#[serde(rename_all = "PascalCase")]
359pub struct LambdaFunctionAssociations {
360    pub quantity: i32,
361    #[serde(default, skip_serializing_if = "skip_if_none")]
362    pub items: Option<LambdaFunctionAssociationItems>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize, Default)]
366#[serde(rename_all = "PascalCase")]
367pub struct LambdaFunctionAssociationItems {
368    #[serde(default)]
369    pub lambda_function_association: Vec<LambdaFunctionAssociation>,
370}
371
372#[derive(Debug, Clone, Serialize, Deserialize, Default)]
373#[serde(rename_all = "PascalCase")]
374pub struct LambdaFunctionAssociation {
375    pub lambda_function_arn: String,
376    pub event_type: String,
377    #[serde(default, skip_serializing_if = "skip_if_none")]
378    pub include_body: Option<bool>,
379}
380
381#[derive(Debug, Clone, Serialize, Deserialize, Default)]
382#[serde(rename_all = "PascalCase")]
383pub struct FunctionAssociations {
384    pub quantity: i32,
385    #[serde(default, skip_serializing_if = "skip_if_none")]
386    pub items: Option<FunctionAssociationItems>,
387}
388
389#[derive(Debug, Clone, Serialize, Deserialize, Default)]
390#[serde(rename_all = "PascalCase")]
391pub struct FunctionAssociationItems {
392    #[serde(default)]
393    pub function_association: Vec<FunctionAssociation>,
394}
395
396#[derive(Debug, Clone, Serialize, Deserialize, Default)]
397#[serde(rename_all = "PascalCase")]
398pub struct FunctionAssociation {
399    pub function_arn: String,
400    pub event_type: String,
401}
402
403#[derive(Debug, Clone, Serialize, Deserialize, Default)]
404#[serde(rename_all = "PascalCase")]
405pub struct GrpcConfig {
406    pub enabled: bool,
407}
408
409#[derive(Debug, Clone, Serialize, Deserialize, Default)]
410#[serde(rename_all = "PascalCase")]
411pub struct ForwardedValues {
412    pub query_string: bool,
413    pub cookies: CookiePreference,
414    #[serde(default, skip_serializing_if = "skip_if_none")]
415    pub headers: Option<Headers>,
416    #[serde(default, skip_serializing_if = "skip_if_none")]
417    pub query_string_cache_keys: Option<QueryStringCacheKeys>,
418}
419
420#[derive(Debug, Clone, Serialize, Deserialize, Default)]
421#[serde(rename_all = "PascalCase")]
422pub struct CookiePreference {
423    pub forward: String,
424    #[serde(default, skip_serializing_if = "skip_if_none")]
425    pub whitelisted_names: Option<CookieNames>,
426}
427
428#[derive(Debug, Clone, Serialize, Deserialize, Default)]
429#[serde(rename_all = "PascalCase")]
430pub struct CookieNames {
431    pub quantity: i32,
432    #[serde(default, skip_serializing_if = "skip_if_none")]
433    pub items: Option<CookieNameList>,
434}
435
436#[derive(Debug, Clone, Serialize, Deserialize, Default)]
437#[serde(rename_all = "PascalCase")]
438pub struct CookieNameList {
439    #[serde(default, rename = "Name")]
440    pub name: Vec<String>,
441}
442
443#[derive(Debug, Clone, Serialize, Deserialize, Default)]
444#[serde(rename_all = "PascalCase")]
445pub struct Headers {
446    pub quantity: i32,
447    #[serde(default, skip_serializing_if = "skip_if_none")]
448    pub items: Option<HeaderList>,
449}
450
451#[derive(Debug, Clone, Serialize, Deserialize, Default)]
452#[serde(rename_all = "PascalCase")]
453pub struct HeaderList {
454    #[serde(default, rename = "Name")]
455    pub name: Vec<String>,
456}
457
458#[derive(Debug, Clone, Serialize, Deserialize, Default)]
459#[serde(rename_all = "PascalCase")]
460pub struct QueryStringCacheKeys {
461    pub quantity: i32,
462    #[serde(default, skip_serializing_if = "skip_if_none")]
463    pub items: Option<QueryStringCacheKeyList>,
464}
465
466#[derive(Debug, Clone, Serialize, Deserialize, Default)]
467#[serde(rename_all = "PascalCase")]
468pub struct QueryStringCacheKeyList {
469    #[serde(default, rename = "Name")]
470    pub name: Vec<String>,
471}
472
473#[derive(Debug, Clone, Serialize, Deserialize, Default)]
474#[serde(rename_all = "PascalCase")]
475pub struct CacheBehaviors {
476    pub quantity: i32,
477    #[serde(default, skip_serializing_if = "skip_if_none")]
478    pub items: Option<CacheBehaviorItems>,
479}
480
481#[derive(Debug, Clone, Serialize, Deserialize, Default)]
482#[serde(rename_all = "PascalCase")]
483pub struct CacheBehaviorItems {
484    #[serde(default)]
485    pub cache_behavior: Vec<CacheBehavior>,
486}
487
488#[derive(Debug, Clone, Serialize, Deserialize, Default)]
489#[serde(rename_all = "PascalCase")]
490pub struct CacheBehavior {
491    pub path_pattern: String,
492    pub target_origin_id: String,
493    #[serde(default, skip_serializing_if = "skip_if_none")]
494    pub trusted_signers: Option<TrustedSigners>,
495    #[serde(default, skip_serializing_if = "skip_if_none")]
496    pub trusted_key_groups: Option<TrustedKeyGroups>,
497    pub viewer_protocol_policy: String,
498    #[serde(default, skip_serializing_if = "skip_if_none")]
499    pub allowed_methods: Option<AllowedMethods>,
500    #[serde(default, skip_serializing_if = "skip_if_none")]
501    pub smooth_streaming: Option<bool>,
502    #[serde(default, skip_serializing_if = "skip_if_none")]
503    pub compress: Option<bool>,
504    #[serde(default, skip_serializing_if = "skip_if_none")]
505    pub lambda_function_associations: Option<LambdaFunctionAssociations>,
506    #[serde(default, skip_serializing_if = "skip_if_none")]
507    pub function_associations: Option<FunctionAssociations>,
508    #[serde(default, skip_serializing_if = "skip_if_none")]
509    pub field_level_encryption_id: Option<String>,
510    #[serde(default, skip_serializing_if = "skip_if_none")]
511    pub realtime_log_config_arn: Option<String>,
512    #[serde(default, skip_serializing_if = "skip_if_none")]
513    pub cache_policy_id: Option<String>,
514    #[serde(default, skip_serializing_if = "skip_if_none")]
515    pub origin_request_policy_id: Option<String>,
516    #[serde(default, skip_serializing_if = "skip_if_none")]
517    pub response_headers_policy_id: Option<String>,
518    #[serde(default, skip_serializing_if = "skip_if_none")]
519    pub grpc_config: Option<GrpcConfig>,
520    #[serde(default, skip_serializing_if = "skip_if_none")]
521    pub forwarded_values: Option<ForwardedValues>,
522    #[serde(default, skip_serializing_if = "skip_if_none")]
523    pub min_ttl: Option<i64>,
524    #[serde(default, skip_serializing_if = "skip_if_none")]
525    pub default_ttl: Option<i64>,
526    #[serde(default, skip_serializing_if = "skip_if_none")]
527    pub max_ttl: Option<i64>,
528}
529
530#[derive(Debug, Clone, Serialize, Deserialize, Default)]
531#[serde(rename_all = "PascalCase")]
532pub struct CustomErrorResponses {
533    pub quantity: i32,
534    #[serde(default, skip_serializing_if = "skip_if_none")]
535    pub items: Option<CustomErrorResponseItems>,
536}
537
538#[derive(Debug, Clone, Serialize, Deserialize, Default)]
539#[serde(rename_all = "PascalCase")]
540pub struct CustomErrorResponseItems {
541    #[serde(default)]
542    pub custom_error_response: Vec<CustomErrorResponse>,
543}
544
545#[derive(Debug, Clone, Serialize, Deserialize, Default)]
546#[serde(rename_all = "PascalCase")]
547pub struct CustomErrorResponse {
548    pub error_code: i32,
549    #[serde(default, skip_serializing_if = "skip_if_none")]
550    pub response_page_path: Option<String>,
551    #[serde(default, skip_serializing_if = "skip_if_none")]
552    pub response_code: Option<String>,
553    #[serde(default, skip_serializing_if = "skip_if_none")]
554    pub error_caching_min_ttl: Option<i64>,
555}
556
557#[derive(Debug, Clone, Serialize, Deserialize, Default)]
558#[serde(rename_all = "PascalCase")]
559pub struct LoggingConfig {
560    pub enabled: bool,
561    pub include_cookies: bool,
562    pub bucket: String,
563    pub prefix: String,
564}
565
566#[derive(Debug, Clone, Serialize, Deserialize, Default)]
567#[serde(rename_all = "PascalCase")]
568pub struct ViewerCertificate {
569    #[serde(default, skip_serializing_if = "skip_if_none")]
570    pub cloud_front_default_certificate: Option<bool>,
571    #[serde(default, skip_serializing_if = "skip_if_none")]
572    pub iam_certificate_id: Option<String>,
573    #[serde(default, skip_serializing_if = "skip_if_none")]
574    pub acm_certificate_arn: Option<String>,
575    #[serde(default, skip_serializing_if = "skip_if_none")]
576    pub ssl_support_method: Option<String>,
577    #[serde(default, skip_serializing_if = "skip_if_none")]
578    pub minimum_protocol_version: Option<String>,
579    #[serde(default, skip_serializing_if = "skip_if_none")]
580    pub certificate: Option<String>,
581    #[serde(default, skip_serializing_if = "skip_if_none")]
582    pub certificate_source: Option<String>,
583}
584
585#[derive(Debug, Clone, Serialize, Deserialize, Default)]
586#[serde(rename_all = "PascalCase")]
587pub struct Restrictions {
588    pub geo_restriction: GeoRestriction,
589}
590
591#[derive(Debug, Clone, Serialize, Deserialize, Default)]
592#[serde(rename_all = "PascalCase")]
593pub struct GeoRestriction {
594    pub restriction_type: String,
595    pub quantity: i32,
596    #[serde(default, skip_serializing_if = "skip_if_none")]
597    pub items: Option<LocationList>,
598}
599
600#[derive(Debug, Clone, Serialize, Deserialize, Default)]
601#[serde(rename_all = "PascalCase")]
602pub struct LocationList {
603    #[serde(default, rename = "Location")]
604    pub location: Vec<String>,
605}
606
607#[derive(Debug, Clone, Serialize, Deserialize, Default)]
608#[serde(rename_all = "PascalCase")]
609pub struct TenantConfig {
610    #[serde(default, skip_serializing_if = "skip_if_none")]
611    pub parameter_definitions: Option<ParameterDefinitions>,
612}
613
614#[derive(Debug, Clone, Serialize, Deserialize, Default)]
615#[serde(rename_all = "PascalCase")]
616pub struct ParameterDefinitions {
617    #[serde(default, rename = "ParameterDefinition")]
618    pub parameter_definition: Vec<ParameterDefinition>,
619}
620
621#[derive(Debug, Clone, Serialize, Deserialize, Default)]
622#[serde(rename_all = "PascalCase")]
623pub struct ParameterDefinition {
624    pub name: String,
625    pub definition: ParameterDefinitionSchema,
626}
627
628#[derive(Debug, Clone, Serialize, Deserialize, Default)]
629#[serde(rename_all = "PascalCase")]
630pub struct ParameterDefinitionSchema {
631    #[serde(default, skip_serializing_if = "skip_if_none")]
632    pub string_schema: Option<StringSchemaConfig>,
633}
634
635#[derive(Debug, Clone, Serialize, Deserialize, Default)]
636#[serde(rename_all = "PascalCase")]
637pub struct StringSchemaConfig {
638    pub required: bool,
639    #[serde(default, skip_serializing_if = "skip_if_none")]
640    pub comment: Option<String>,
641    #[serde(default, skip_serializing_if = "skip_if_none")]
642    pub default_value: Option<String>,
643}
644
645// ─── Tags ─────────────────────────────────────────────────────────────
646
647#[derive(Debug, Clone, Serialize, Deserialize, Default)]
648#[serde(rename_all = "PascalCase")]
649pub struct Tags {
650    #[serde(default, skip_serializing_if = "skip_if_none")]
651    pub items: Option<TagList>,
652}
653
654#[derive(Debug, Clone, Serialize, Deserialize, Default)]
655#[serde(rename_all = "PascalCase")]
656pub struct TagList {
657    #[serde(default, rename = "Tag")]
658    pub tag: Vec<Tag>,
659}
660
661#[derive(Debug, Clone, Serialize, Deserialize, Default)]
662#[serde(rename_all = "PascalCase")]
663pub struct Tag {
664    pub key: String,
665    #[serde(default, skip_serializing_if = "skip_if_none")]
666    pub value: Option<String>,
667}
668
669#[derive(Debug, Clone, Serialize, Deserialize, Default)]
670#[serde(rename_all = "PascalCase")]
671pub struct TagKeys {
672    #[serde(default, skip_serializing_if = "skip_if_none")]
673    pub items: Option<TagKeyList>,
674}
675
676#[derive(Debug, Clone, Serialize, Deserialize, Default)]
677#[serde(rename_all = "PascalCase")]
678pub struct TagKeyList {
679    #[serde(default, rename = "Key")]
680    pub key: Vec<String>,
681}
682
683// ─── Distribution + Wrappers ─────────────────────────────────────────
684
685#[derive(Debug, Clone, Serialize, Deserialize, Default)]
686#[serde(rename_all = "PascalCase")]
687pub struct DistributionConfigWithTags {
688    pub distribution_config: DistributionConfig,
689    pub tags: Tags,
690}
691
692// ─── Invalidation ─────────────────────────────────────────────────────
693
694#[derive(Debug, Clone, Serialize, Deserialize, Default)]
695#[serde(rename_all = "PascalCase")]
696pub struct InvalidationBatch {
697    pub paths: Paths,
698    pub caller_reference: String,
699}
700
701#[derive(Debug, Clone, Serialize, Deserialize, Default)]
702#[serde(rename_all = "PascalCase")]
703pub struct Paths {
704    pub quantity: i32,
705    #[serde(default, skip_serializing_if = "skip_if_none")]
706    pub items: Option<PathList>,
707}
708
709#[derive(Debug, Clone, Serialize, Deserialize, Default)]
710#[serde(rename_all = "PascalCase")]
711pub struct PathList {
712    #[serde(default, rename = "Path")]
713    pub path: Vec<String>,
714}