1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
7pub enum BehaviorOnMXFailure {
8 #[default]
10 RejectMessage,
11 UseDefaultValue,
12}
13
14impl BehaviorOnMXFailure {
15 #[must_use]
17 pub fn as_str(&self) -> &'static str {
18 match self {
19 Self::RejectMessage => "RejectMessage",
20 Self::UseDefaultValue => "UseDefaultValue",
21 }
22 }
23}
24
25impl std::fmt::Display for BehaviorOnMXFailure {
26 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27 f.write_str(self.as_str())
28 }
29}
30
31impl From<&str> for BehaviorOnMXFailure {
32 fn from(s: &str) -> Self {
33 match s {
34 "RejectMessage" => Self::RejectMessage,
35 "UseDefaultValue" => Self::UseDefaultValue,
36 _ => Self::default(),
37 }
38 }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
43pub enum ConfigurationSetAttribute {
44 #[default]
46 #[serde(rename = "deliveryOptions")]
47 DeliveryOptions,
48 #[serde(rename = "eventDestinations")]
49 EventDestinations,
50 #[serde(rename = "reputationOptions")]
51 ReputationOptions,
52 #[serde(rename = "trackingOptions")]
53 TrackingOptions,
54}
55
56impl ConfigurationSetAttribute {
57 #[must_use]
59 pub fn as_str(&self) -> &'static str {
60 match self {
61 Self::DeliveryOptions => "deliveryOptions",
62 Self::EventDestinations => "eventDestinations",
63 Self::ReputationOptions => "reputationOptions",
64 Self::TrackingOptions => "trackingOptions",
65 }
66 }
67}
68
69impl std::fmt::Display for ConfigurationSetAttribute {
70 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71 f.write_str(self.as_str())
72 }
73}
74
75impl From<&str> for ConfigurationSetAttribute {
76 fn from(s: &str) -> Self {
77 match s {
78 "deliveryOptions" => Self::DeliveryOptions,
79 "eventDestinations" => Self::EventDestinations,
80 "reputationOptions" => Self::ReputationOptions,
81 "trackingOptions" => Self::TrackingOptions,
82 _ => Self::default(),
83 }
84 }
85}
86
87#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
89pub enum CustomMailFromStatus {
90 #[default]
92 Failed,
93 Pending,
94 Success,
95 TemporaryFailure,
96}
97
98impl CustomMailFromStatus {
99 #[must_use]
101 pub fn as_str(&self) -> &'static str {
102 match self {
103 Self::Failed => "Failed",
104 Self::Pending => "Pending",
105 Self::Success => "Success",
106 Self::TemporaryFailure => "TemporaryFailure",
107 }
108 }
109}
110
111impl std::fmt::Display for CustomMailFromStatus {
112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113 f.write_str(self.as_str())
114 }
115}
116
117impl From<&str> for CustomMailFromStatus {
118 fn from(s: &str) -> Self {
119 match s {
120 "Failed" => Self::Failed,
121 "Pending" => Self::Pending,
122 "Success" => Self::Success,
123 "TemporaryFailure" => Self::TemporaryFailure,
124 _ => Self::default(),
125 }
126 }
127}
128
129#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
131pub enum DimensionValueSource {
132 #[default]
134 #[serde(rename = "emailHeader")]
135 EmailHeader,
136 #[serde(rename = "linkTag")]
137 LinkTag,
138 #[serde(rename = "messageTag")]
139 MessageTag,
140}
141
142impl DimensionValueSource {
143 #[must_use]
145 pub fn as_str(&self) -> &'static str {
146 match self {
147 Self::EmailHeader => "emailHeader",
148 Self::LinkTag => "linkTag",
149 Self::MessageTag => "messageTag",
150 }
151 }
152}
153
154impl std::fmt::Display for DimensionValueSource {
155 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
156 f.write_str(self.as_str())
157 }
158}
159
160impl From<&str> for DimensionValueSource {
161 fn from(s: &str) -> Self {
162 match s {
163 "emailHeader" => Self::EmailHeader,
164 "linkTag" => Self::LinkTag,
165 "messageTag" => Self::MessageTag,
166 _ => Self::default(),
167 }
168 }
169}
170
171#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
173pub enum EventType {
174 #[default]
176 #[serde(rename = "bounce")]
177 Bounce,
178 #[serde(rename = "click")]
179 Click,
180 #[serde(rename = "complaint")]
181 Complaint,
182 #[serde(rename = "delivery")]
183 Delivery,
184 #[serde(rename = "open")]
185 Open,
186 #[serde(rename = "reject")]
187 Reject,
188 #[serde(rename = "renderingFailure")]
189 RenderingFailure,
190 #[serde(rename = "send")]
191 Send,
192}
193
194impl EventType {
195 #[must_use]
197 pub fn as_str(&self) -> &'static str {
198 match self {
199 Self::Bounce => "bounce",
200 Self::Click => "click",
201 Self::Complaint => "complaint",
202 Self::Delivery => "delivery",
203 Self::Open => "open",
204 Self::Reject => "reject",
205 Self::RenderingFailure => "renderingFailure",
206 Self::Send => "send",
207 }
208 }
209}
210
211impl std::fmt::Display for EventType {
212 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
213 f.write_str(self.as_str())
214 }
215}
216
217impl From<&str> for EventType {
218 fn from(s: &str) -> Self {
219 match s {
220 "bounce" => Self::Bounce,
221 "click" => Self::Click,
222 "complaint" => Self::Complaint,
223 "delivery" => Self::Delivery,
224 "open" => Self::Open,
225 "reject" => Self::Reject,
226 "renderingFailure" => Self::RenderingFailure,
227 "send" => Self::Send,
228 _ => Self::default(),
229 }
230 }
231}
232
233#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
235pub enum IdentityType {
236 #[default]
238 Domain,
239 EmailAddress,
240}
241
242impl IdentityType {
243 #[must_use]
245 pub fn as_str(&self) -> &'static str {
246 match self {
247 Self::Domain => "Domain",
248 Self::EmailAddress => "EmailAddress",
249 }
250 }
251}
252
253impl std::fmt::Display for IdentityType {
254 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
255 f.write_str(self.as_str())
256 }
257}
258
259impl From<&str> for IdentityType {
260 fn from(s: &str) -> Self {
261 match s {
262 "Domain" => Self::Domain,
263 "EmailAddress" => Self::EmailAddress,
264 _ => Self::default(),
265 }
266 }
267}
268
269#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
271pub enum InvocationType {
272 #[default]
274 Event,
275 RequestResponse,
276}
277
278impl InvocationType {
279 #[must_use]
281 pub fn as_str(&self) -> &'static str {
282 match self {
283 Self::Event => "Event",
284 Self::RequestResponse => "RequestResponse",
285 }
286 }
287}
288
289impl std::fmt::Display for InvocationType {
290 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
291 f.write_str(self.as_str())
292 }
293}
294
295impl From<&str> for InvocationType {
296 fn from(s: &str) -> Self {
297 match s {
298 "Event" => Self::Event,
299 "RequestResponse" => Self::RequestResponse,
300 _ => Self::default(),
301 }
302 }
303}
304
305#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
307pub enum NotificationType {
308 #[default]
310 Bounce,
311 Complaint,
312 Delivery,
313}
314
315impl NotificationType {
316 #[must_use]
318 pub fn as_str(&self) -> &'static str {
319 match self {
320 Self::Bounce => "Bounce",
321 Self::Complaint => "Complaint",
322 Self::Delivery => "Delivery",
323 }
324 }
325}
326
327impl std::fmt::Display for NotificationType {
328 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
329 f.write_str(self.as_str())
330 }
331}
332
333impl From<&str> for NotificationType {
334 fn from(s: &str) -> Self {
335 match s {
336 "Bounce" => Self::Bounce,
337 "Complaint" => Self::Complaint,
338 "Delivery" => Self::Delivery,
339 _ => Self::default(),
340 }
341 }
342}
343
344#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
346pub enum SNSActionEncoding {
347 #[default]
349 Base64,
350 #[serde(rename = "UTF-8")]
351 Utf8,
352}
353
354impl SNSActionEncoding {
355 #[must_use]
357 pub fn as_str(&self) -> &'static str {
358 match self {
359 Self::Base64 => "Base64",
360 Self::Utf8 => "UTF-8",
361 }
362 }
363}
364
365impl std::fmt::Display for SNSActionEncoding {
366 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
367 f.write_str(self.as_str())
368 }
369}
370
371impl From<&str> for SNSActionEncoding {
372 fn from(s: &str) -> Self {
373 match s {
374 "Base64" => Self::Base64,
375 "UTF-8" => Self::Utf8,
376 _ => Self::default(),
377 }
378 }
379}
380
381#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
383pub enum StopScope {
384 #[default]
386 RuleSet,
387}
388
389impl StopScope {
390 #[must_use]
392 pub fn as_str(&self) -> &'static str {
393 match self {
394 Self::RuleSet => "RuleSet",
395 }
396 }
397}
398
399impl std::fmt::Display for StopScope {
400 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
401 f.write_str(self.as_str())
402 }
403}
404
405impl From<&str> for StopScope {
406 fn from(s: &str) -> Self {
407 match s {
408 "RuleSet" => Self::RuleSet,
409 _ => Self::default(),
410 }
411 }
412}
413
414#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
416pub enum TlsPolicy {
417 #[default]
419 Optional,
420 Require,
421}
422
423impl TlsPolicy {
424 #[must_use]
426 pub fn as_str(&self) -> &'static str {
427 match self {
428 Self::Optional => "Optional",
429 Self::Require => "Require",
430 }
431 }
432}
433
434impl std::fmt::Display for TlsPolicy {
435 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
436 f.write_str(self.as_str())
437 }
438}
439
440impl From<&str> for TlsPolicy {
441 fn from(s: &str) -> Self {
442 match s {
443 "Optional" => Self::Optional,
444 "Require" => Self::Require,
445 _ => Self::default(),
446 }
447 }
448}
449
450#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
452pub enum VerificationStatus {
453 #[default]
455 Failed,
456 NotStarted,
457 Pending,
458 Success,
459 TemporaryFailure,
460}
461
462impl VerificationStatus {
463 #[must_use]
465 pub fn as_str(&self) -> &'static str {
466 match self {
467 Self::Failed => "Failed",
468 Self::NotStarted => "NotStarted",
469 Self::Pending => "Pending",
470 Self::Success => "Success",
471 Self::TemporaryFailure => "TemporaryFailure",
472 }
473 }
474}
475
476impl std::fmt::Display for VerificationStatus {
477 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
478 f.write_str(self.as_str())
479 }
480}
481
482impl From<&str> for VerificationStatus {
483 fn from(s: &str) -> Self {
484 match s {
485 "Failed" => Self::Failed,
486 "NotStarted" => Self::NotStarted,
487 "Pending" => Self::Pending,
488 "Success" => Self::Success,
489 "TemporaryFailure" => Self::TemporaryFailure,
490 _ => Self::default(),
491 }
492 }
493}
494
495#[derive(Debug, Clone, Default, Serialize, Deserialize)]
497#[serde(rename_all = "PascalCase")]
498pub struct AddHeaderAction {
499 pub header_name: String,
500 pub header_value: String,
501}
502
503#[derive(Debug, Clone, Default, Serialize, Deserialize)]
505#[serde(rename_all = "PascalCase")]
506pub struct Body {
507 #[serde(skip_serializing_if = "Option::is_none")]
508 pub html: Option<Content>,
509 #[serde(skip_serializing_if = "Option::is_none")]
510 pub text: Option<Content>,
511}
512
513#[derive(Debug, Clone, Default, Serialize, Deserialize)]
515#[serde(rename_all = "PascalCase")]
516pub struct BounceAction {
517 pub message: String,
518 pub sender: String,
519 pub smtp_reply_code: String,
520 #[serde(skip_serializing_if = "Option::is_none")]
521 pub status_code: Option<String>,
522 #[serde(skip_serializing_if = "Option::is_none")]
523 pub topic_arn: Option<String>,
524}
525
526#[derive(Debug, Clone, Default, Serialize, Deserialize)]
528#[serde(rename_all = "PascalCase")]
529pub struct CloudWatchDestination {
530 #[serde(default, skip_serializing_if = "Vec::is_empty")]
531 pub dimension_configurations: Vec<CloudWatchDimensionConfiguration>,
532}
533
534#[derive(Debug, Clone, Default, Serialize, Deserialize)]
536#[serde(rename_all = "PascalCase")]
537pub struct CloudWatchDimensionConfiguration {
538 pub default_dimension_value: String,
539 pub dimension_name: String,
540 pub dimension_value_source: DimensionValueSource,
541}
542
543#[derive(Debug, Clone, Default, Serialize, Deserialize)]
545#[serde(rename_all = "PascalCase")]
546pub struct ConfigurationSet {
547 pub name: String,
548}
549
550#[derive(Debug, Clone, Default, Serialize, Deserialize)]
552#[serde(rename_all = "PascalCase")]
553pub struct ConnectAction {
554 #[serde(rename = "IAMRoleARN")]
555 pub iam_role_arn: String,
556 #[serde(rename = "InstanceARN")]
557 pub instance_arn: String,
558}
559
560#[derive(Debug, Clone, Default, Serialize, Deserialize)]
562#[serde(rename_all = "PascalCase")]
563pub struct Content {
564 #[serde(skip_serializing_if = "Option::is_none")]
565 pub charset: Option<String>,
566 pub data: String,
567}
568
569#[derive(Debug, Clone, Default, Serialize, Deserialize)]
571#[serde(rename_all = "PascalCase")]
572pub struct DeliveryOptions {
573 #[serde(skip_serializing_if = "Option::is_none")]
574 pub tls_policy: Option<TlsPolicy>,
575}
576
577#[derive(Debug, Clone, Default, Serialize, Deserialize)]
579#[serde(rename_all = "PascalCase")]
580pub struct Destination {
581 #[serde(default, skip_serializing_if = "Vec::is_empty")]
582 pub bcc_addresses: Vec<String>,
583 #[serde(default, skip_serializing_if = "Vec::is_empty")]
584 pub cc_addresses: Vec<String>,
585 #[serde(default, skip_serializing_if = "Vec::is_empty")]
586 pub to_addresses: Vec<String>,
587}
588
589#[derive(Debug, Clone, Default, Serialize, Deserialize)]
591#[serde(rename_all = "PascalCase")]
592pub struct EventDestination {
593 #[serde(skip_serializing_if = "Option::is_none")]
594 pub cloud_watch_destination: Option<CloudWatchDestination>,
595 #[serde(skip_serializing_if = "Option::is_none")]
596 pub enabled: Option<bool>,
597 #[serde(skip_serializing_if = "Option::is_none")]
598 pub kinesis_firehose_destination: Option<KinesisFirehoseDestination>,
599 #[serde(default, skip_serializing_if = "Vec::is_empty")]
600 pub matching_event_types: Vec<EventType>,
601 pub name: String,
602 #[serde(rename = "SNSDestination")]
603 #[serde(skip_serializing_if = "Option::is_none")]
604 pub sns_destination: Option<SNSDestination>,
605}
606
607#[derive(Debug, Clone, Default, Serialize, Deserialize)]
609#[serde(rename_all = "PascalCase")]
610pub struct IdentityDkimAttributes {
611 pub dkim_enabled: bool,
612 #[serde(default, skip_serializing_if = "Vec::is_empty")]
613 pub dkim_tokens: Vec<String>,
614 pub dkim_verification_status: VerificationStatus,
615}
616
617#[derive(Debug, Clone, Default, Serialize, Deserialize)]
619#[serde(rename_all = "PascalCase")]
620pub struct IdentityMailFromDomainAttributes {
621 #[serde(rename = "BehaviorOnMXFailure")]
622 pub behavior_on_mx_failure: BehaviorOnMXFailure,
623 pub mail_from_domain: String,
624 pub mail_from_domain_status: CustomMailFromStatus,
625}
626
627#[derive(Debug, Clone, Default, Serialize, Deserialize)]
629#[serde(rename_all = "PascalCase")]
630pub struct IdentityNotificationAttributes {
631 pub bounce_topic: String,
632 pub complaint_topic: String,
633 pub delivery_topic: String,
634 pub forwarding_enabled: bool,
635 #[serde(skip_serializing_if = "Option::is_none")]
636 pub headers_in_bounce_notifications_enabled: Option<bool>,
637 #[serde(skip_serializing_if = "Option::is_none")]
638 pub headers_in_complaint_notifications_enabled: Option<bool>,
639 #[serde(skip_serializing_if = "Option::is_none")]
640 pub headers_in_delivery_notifications_enabled: Option<bool>,
641}
642
643#[derive(Debug, Clone, Default, Serialize, Deserialize)]
645#[serde(rename_all = "PascalCase")]
646pub struct IdentityVerificationAttributes {
647 pub verification_status: VerificationStatus,
648 #[serde(skip_serializing_if = "Option::is_none")]
649 pub verification_token: Option<String>,
650}
651
652#[derive(Debug, Clone, Default, Serialize, Deserialize)]
654#[serde(rename_all = "PascalCase")]
655pub struct KinesisFirehoseDestination {
656 #[serde(rename = "DeliveryStreamARN")]
657 pub delivery_stream_arn: String,
658 #[serde(rename = "IAMRoleARN")]
659 pub iam_role_arn: String,
660}
661
662#[derive(Debug, Clone, Default, Serialize, Deserialize)]
664#[serde(rename_all = "PascalCase")]
665pub struct LambdaAction {
666 pub function_arn: String,
667 #[serde(skip_serializing_if = "Option::is_none")]
668 pub invocation_type: Option<InvocationType>,
669 #[serde(skip_serializing_if = "Option::is_none")]
670 pub topic_arn: Option<String>,
671}
672
673#[derive(Debug, Clone, Default, Serialize, Deserialize)]
675#[serde(rename_all = "PascalCase")]
676pub struct Message {
677 pub body: Body,
678 pub subject: Content,
679}
680
681#[derive(Debug, Clone, Default, Serialize, Deserialize)]
683#[serde(rename_all = "PascalCase")]
684pub struct MessageTag {
685 pub name: String,
686 pub value: String,
687}
688
689#[derive(Debug, Clone, Default, Serialize, Deserialize)]
691#[serde(rename_all = "PascalCase")]
692pub struct RawMessage {
693 pub data: Vec<u8>,
694}
695
696#[derive(Debug, Clone, Default, Serialize, Deserialize)]
698#[serde(rename_all = "PascalCase")]
699pub struct ReceiptAction {
700 #[serde(skip_serializing_if = "Option::is_none")]
701 pub add_header_action: Option<AddHeaderAction>,
702 #[serde(skip_serializing_if = "Option::is_none")]
703 pub bounce_action: Option<BounceAction>,
704 #[serde(skip_serializing_if = "Option::is_none")]
705 pub connect_action: Option<ConnectAction>,
706 #[serde(skip_serializing_if = "Option::is_none")]
707 pub lambda_action: Option<LambdaAction>,
708 #[serde(skip_serializing_if = "Option::is_none")]
709 pub s3_action: Option<S3Action>,
710 #[serde(rename = "SNSAction")]
711 #[serde(skip_serializing_if = "Option::is_none")]
712 pub sns_action: Option<SNSAction>,
713 #[serde(skip_serializing_if = "Option::is_none")]
714 pub stop_action: Option<StopAction>,
715 #[serde(skip_serializing_if = "Option::is_none")]
716 pub workmail_action: Option<WorkmailAction>,
717}
718
719#[derive(Debug, Clone, Default, Serialize, Deserialize)]
721#[serde(rename_all = "PascalCase")]
722pub struct ReceiptRule {
723 #[serde(default, skip_serializing_if = "Vec::is_empty")]
724 pub actions: Vec<ReceiptAction>,
725 #[serde(skip_serializing_if = "Option::is_none")]
726 pub enabled: Option<bool>,
727 pub name: String,
728 #[serde(default, skip_serializing_if = "Vec::is_empty")]
729 pub recipients: Vec<String>,
730 #[serde(skip_serializing_if = "Option::is_none")]
731 pub scan_enabled: Option<bool>,
732 #[serde(skip_serializing_if = "Option::is_none")]
733 pub tls_policy: Option<TlsPolicy>,
734}
735
736#[derive(Debug, Clone, Default, Serialize, Deserialize)]
738#[serde(rename_all = "PascalCase")]
739pub struct ReceiptRuleSetMetadata {
740 #[serde(skip_serializing_if = "Option::is_none")]
741 pub created_timestamp: Option<chrono::DateTime<chrono::Utc>>,
742 #[serde(skip_serializing_if = "Option::is_none")]
743 pub name: Option<String>,
744}
745
746#[derive(Debug, Clone, Default, Serialize, Deserialize)]
748#[serde(rename_all = "PascalCase")]
749pub struct ReputationOptions {
750 #[serde(skip_serializing_if = "Option::is_none")]
751 pub last_fresh_start: Option<chrono::DateTime<chrono::Utc>>,
752 #[serde(skip_serializing_if = "Option::is_none")]
753 pub reputation_metrics_enabled: Option<bool>,
754 #[serde(skip_serializing_if = "Option::is_none")]
755 pub sending_enabled: Option<bool>,
756}
757
758#[derive(Debug, Clone, Default, Serialize, Deserialize)]
760#[serde(rename_all = "PascalCase")]
761pub struct S3Action {
762 pub bucket_name: String,
763 #[serde(skip_serializing_if = "Option::is_none")]
764 pub iam_role_arn: Option<String>,
765 #[serde(skip_serializing_if = "Option::is_none")]
766 pub kms_key_arn: Option<String>,
767 #[serde(skip_serializing_if = "Option::is_none")]
768 pub object_key_prefix: Option<String>,
769 #[serde(skip_serializing_if = "Option::is_none")]
770 pub topic_arn: Option<String>,
771}
772
773#[derive(Debug, Clone, Default, Serialize, Deserialize)]
775#[serde(rename_all = "PascalCase")]
776pub struct SNSAction {
777 #[serde(skip_serializing_if = "Option::is_none")]
778 pub encoding: Option<SNSActionEncoding>,
779 pub topic_arn: String,
780}
781
782#[derive(Debug, Clone, Default, Serialize, Deserialize)]
784#[serde(rename_all = "PascalCase")]
785pub struct SNSDestination {
786 #[serde(rename = "TopicARN")]
787 pub topic_arn: String,
788}
789
790#[derive(Debug, Clone, Default, Serialize, Deserialize)]
792#[serde(rename_all = "PascalCase")]
793pub struct SendDataPoint {
794 #[serde(skip_serializing_if = "Option::is_none")]
795 pub bounces: Option<i64>,
796 #[serde(skip_serializing_if = "Option::is_none")]
797 pub complaints: Option<i64>,
798 #[serde(skip_serializing_if = "Option::is_none")]
799 pub delivery_attempts: Option<i64>,
800 #[serde(skip_serializing_if = "Option::is_none")]
801 pub rejects: Option<i64>,
802 #[serde(skip_serializing_if = "Option::is_none")]
803 pub timestamp: Option<chrono::DateTime<chrono::Utc>>,
804}
805
806#[derive(Debug, Clone, Default, Serialize, Deserialize)]
808#[serde(rename_all = "PascalCase")]
809pub struct StopAction {
810 pub scope: StopScope,
811 #[serde(skip_serializing_if = "Option::is_none")]
812 pub topic_arn: Option<String>,
813}
814
815#[derive(Debug, Clone, Default, Serialize, Deserialize)]
817#[serde(rename_all = "PascalCase")]
818pub struct Template {
819 #[serde(skip_serializing_if = "Option::is_none")]
820 pub html_part: Option<String>,
821 #[serde(skip_serializing_if = "Option::is_none")]
822 pub subject_part: Option<String>,
823 pub template_name: String,
824 #[serde(skip_serializing_if = "Option::is_none")]
825 pub text_part: Option<String>,
826}
827
828#[derive(Debug, Clone, Default, Serialize, Deserialize)]
830#[serde(rename_all = "PascalCase")]
831pub struct TemplateMetadata {
832 #[serde(skip_serializing_if = "Option::is_none")]
833 pub created_timestamp: Option<chrono::DateTime<chrono::Utc>>,
834 #[serde(skip_serializing_if = "Option::is_none")]
835 pub name: Option<String>,
836}
837
838#[derive(Debug, Clone, Default, Serialize, Deserialize)]
840#[serde(rename_all = "PascalCase")]
841pub struct TrackingOptions {
842 #[serde(skip_serializing_if = "Option::is_none")]
843 pub custom_redirect_domain: Option<String>,
844}
845
846#[derive(Debug, Clone, Default, Serialize, Deserialize)]
848#[serde(rename_all = "PascalCase")]
849pub struct WorkmailAction {
850 pub organization_arn: String,
851 #[serde(skip_serializing_if = "Option::is_none")]
852 pub topic_arn: Option<String>,
853}