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