reinfer_client/resources/
email.rs1use crate::Error;
2use std::str::FromStr;
3
4use crate::{ReducibleResponse, SplittableRequest};
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8use crate::resources::attachments::AttachmentMetadata;
9
10pub type Result<T> = std::result::Result<T, Error>;
11
12#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
13pub struct Mailbox(pub String);
14
15#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
16pub struct MimeContent(pub String);
17
18#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
19pub struct Id(pub String);
20
21impl FromStr for Id {
22 type Err = Error;
23
24 fn from_str(string: &str) -> Result<Self> {
25 Ok(Self(string.to_owned()))
26 }
27}
28
29#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Default)]
30pub struct EmailMetadata {
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub sensitivity: Option<String>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub size: Option<u64>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub categories: Option<Vec<String>>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub importance: Option<String>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub has_attachments: Option<bool>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub conversation_id: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub conversation_topic: Option<String>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub is_read: Option<bool>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub folder: Option<Vec<String>>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub received_at: Option<String>,
51}
52
53#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
54pub struct Email {
55 pub id: Id,
56 pub mailbox: Mailbox,
57 pub timestamp: DateTime<Utc>,
58 pub mime_content: MimeContent,
59 pub metadata: Option<EmailMetadata>,
60 pub attachments: Vec<AttachmentMetadata>,
61 pub created_at: Option<DateTime<Utc>>,
62 pub updated_at: Option<DateTime<Utc>>,
63}
64
65#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
66pub struct NewEmail {
67 pub id: Id,
68 pub mailbox: Mailbox,
69 pub timestamp: DateTime<Utc>,
70 pub mime_content: MimeContent,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub metadata: Option<EmailMetadata>,
73 #[serde(skip_serializing_if = "Vec::is_empty", default)]
74 pub attachments: Vec<AttachmentMetadata>,
75}
76
77#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
78pub(crate) struct PutEmailsRequest {
79 pub emails: Vec<NewEmail>,
80}
81
82impl SplittableRequest for PutEmailsRequest {
83 fn split(self) -> impl Iterator<Item = Self>
84 where
85 Self: Sized,
86 {
87 self.emails.into_iter().map(|email| Self {
88 emails: vec![email],
89 })
90 }
91
92 fn count(&self) -> usize {
93 self.emails.len()
94 }
95}
96
97#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
98pub struct PutEmailsResponse {}
99
100impl ReducibleResponse for PutEmailsResponse {}
101
102#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
103pub struct Continuation(pub String);
104
105#[derive(Debug, Clone, Deserialize)]
106pub struct EmailsIterPage {
107 pub emails: Vec<Email>,
108 pub continuation: Option<Continuation>,
109}
110
111#[derive(Debug, Clone, Deserialize)]
112pub struct GetEmailResponse {
113 pub emails: Vec<Email>,
114}