From 70df0e341cbeee95bc3d84470e86aa56180827db Mon Sep 17 00:00:00 2001 From: Mauro D Date: Wed, 1 Jun 2022 14:19:02 +0000 Subject: [PATCH] Use of associated types + Identity and EmailSubmission helpers. --- src/email_submission/get.rs | 23 +++++++++++-- src/email_submission/helpers.rs | 5 +-- src/email_submission/mod.rs | 8 ++--- src/email_submission/set.rs | 60 ++++++++++++++++++++++++++------- 4 files changed, 75 insertions(+), 21 deletions(-) diff --git a/src/email_submission/get.rs b/src/email_submission/get.rs index 7dd54ef..6a2926c 100644 --- a/src/email_submission/get.rs +++ b/src/email_submission/get.rs @@ -1,4 +1,6 @@ -use crate::{Get, core::get::GetObject, Set}; +use std::collections::HashMap; + +use crate::{core::get::GetObject, Get, Set}; use super::{Address, Delivered, DeliveryStatus, Displayed, EmailSubmission, UndoStatus}; @@ -7,6 +9,10 @@ impl EmailSubmission { self.id.as_ref().unwrap() } + pub fn unwrap_id(self) -> String { + self.id.unwrap() + } + pub fn identity_id(&self) -> &str { self.identity_id.as_ref().unwrap() } @@ -35,10 +41,14 @@ impl EmailSubmission { self.undo_status.as_ref().unwrap() } - pub fn delivery_status(&self, email: &str) -> Option<&DeliveryStatus> { + pub fn delivery_status_email(&self, email: &str) -> Option<&DeliveryStatus> { self.delivery_status.as_ref().and_then(|ds| ds.get(email)) } + pub fn delivery_status(&self) -> Option<&HashMap> { + self.delivery_status.as_ref() + } + pub fn dsn_blob_ids(&self) -> Option<&[String]> { self.dsn_blob_ids.as_deref() } @@ -66,6 +76,15 @@ impl Address { } impl DeliveryStatus { + #[cfg(feature = "debug")] + pub fn new(smtp_reply: impl Into, delivered: Delivered, displayed: Displayed) -> Self { + Self { + smtp_reply: smtp_reply.into(), + delivered, + displayed, + } + } + pub fn smtp_reply(&self) -> &str { &self.smtp_reply } diff --git a/src/email_submission/helpers.rs b/src/email_submission/helpers.rs index f93ee51..acf0329 100644 --- a/src/email_submission/helpers.rs +++ b/src/email_submission/helpers.rs @@ -34,14 +34,15 @@ impl Client { .created(&id) } - pub async fn email_submission_create_envelope( + pub async fn email_submission_create_envelope( &mut self, email_id: impl Into, identity_id: impl Into, - mail_from: U, + mail_from: S, rcpt_to: T, ) -> crate::Result> where + S: Into
, T: IntoIterator, U: Into
, { diff --git a/src/email_submission/mod.rs b/src/email_submission/mod.rs index 732f274..325c3b6 100644 --- a/src/email_submission/mod.rs +++ b/src/email_submission/mod.rs @@ -89,7 +89,7 @@ pub struct Address { parameters: Option>>, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] pub enum UndoStatus { #[serde(rename = "pending")] Pending, @@ -99,7 +99,7 @@ pub enum UndoStatus { Canceled, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct DeliveryStatus { #[serde(rename = "smtpReply")] smtp_reply: String, @@ -111,7 +111,7 @@ pub struct DeliveryStatus { displayed: Displayed, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] pub enum Delivered { #[serde(rename = "queued")] Queued, @@ -123,7 +123,7 @@ pub enum Delivered { Unknown, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] pub enum Displayed { #[serde(rename = "unknown")] Unknown, diff --git a/src/email_submission/set.rs b/src/email_submission/set.rs index e0b398d..bbfe113 100644 --- a/src/email_submission/set.rs +++ b/src/email_submission/set.rs @@ -15,15 +15,13 @@ impl EmailSubmission { self } - pub fn envelope(&mut self, mail_from: U, rcpt_to: T) -> &mut Self + pub fn envelope(&mut self, mail_from: S, rcpt_to: T) -> &mut Self where + S: Into
, T: IntoIterator, U: Into
, { - self.envelope = Some(Envelope { - mail_from: mail_from.into(), - rcpt_to: rcpt_to.into_iter().map(|s| s.into()).collect(), - }); + self.envelope = Some(Envelope::new(mail_from, rcpt_to)); self } @@ -70,21 +68,37 @@ impl SetObject for EmailSubmission { } } -impl Address { - pub fn new(email: String) -> Address { - Address { - _state: Default::default(), - email, - parameters: None, +impl Envelope { + pub fn new(mail_from: S, rcpt_to: T) -> Envelope + where + S: Into
, + T: IntoIterator, + U: Into
, + { + Envelope { + mail_from: mail_from.into(), + rcpt_to: rcpt_to.into_iter().map(|s| s.into()).collect(), } } } impl Address { - pub fn parameter(mut self, parameter: String, value: Option) -> Self { + pub fn new(email: impl Into) -> Address { + Address { + _state: Default::default(), + email: email.into(), + parameters: None, + } + } + + pub fn parameter( + mut self, + parameter: impl Into, + value: Option>, + ) -> Self { self.parameters .get_or_insert_with(HashMap::new) - .insert(parameter, value); + .insert(parameter.into(), value.map(|s| s.into())); self } } @@ -108,3 +122,23 @@ impl From<&str> for Address { } } } + +impl From> for Address { + fn from(addr: Address) -> Self { + Address { + _state: Default::default(), + email: addr.email, + parameters: addr.parameters, + } + } +} + +impl From> for Address { + fn from(addr: Address) -> Self { + Address { + _state: Default::default(), + email: addr.email, + parameters: addr.parameters, + } + } +}