reinfer_client/resources/
email.rs

1use 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}