use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Serialize)]
pub struct CreateEmailBaseOptions {
pub from: String,
pub to: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subject: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cc: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bcc: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracking: Option<Tracking>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduled_at: Option<String>,
}
impl CreateEmailBaseOptions {
pub fn new(
from: impl Into<String>,
to: impl IntoIterator<Item = impl Into<String>>,
subject: impl Into<String>,
) -> Self {
Self {
from: from.into(),
to: to.into_iter().map(|t| t.into()).collect(),
subject: Some(subject.into()),
html: None,
text: None,
template: None,
variables: None,
cc: None,
bcc: None,
reply_to: None,
attachments: None,
tags: None,
metadata: None,
tracking: None,
scheduled_at: None,
}
}
pub fn with_html(mut self, html: impl Into<String>) -> Self {
self.html = Some(html.into());
self
}
pub fn with_text(mut self, text: impl Into<String>) -> Self {
self.text = Some(text.into());
self
}
pub fn with_template(mut self, template: impl Into<String>) -> Self {
self.template = Some(template.into());
self.subject = None;
self
}
pub fn with_variables(mut self, variables: HashMap<String, Value>) -> Self {
self.variables = Some(variables);
self
}
pub fn with_cc(mut self, cc: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.cc = Some(cc.into_iter().map(|c| c.into()).collect());
self
}
pub fn with_bcc(mut self, bcc: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.bcc = Some(bcc.into_iter().map(|b| b.into()).collect());
self
}
pub fn with_reply_to(mut self, reply_to: impl Into<String>) -> Self {
self.reply_to = Some(reply_to.into());
self
}
pub fn with_attachments(mut self, attachments: Vec<Attachment>) -> Self {
self.attachments = Some(attachments);
self
}
pub fn with_tags(mut self, tags: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.tags = Some(tags.into_iter().map(|t| t.into()).collect());
self
}
pub fn with_metadata(mut self, metadata: HashMap<String, Value>) -> Self {
self.metadata = Some(metadata);
self
}
pub fn with_tracking(mut self, tracking: Tracking) -> Self {
self.tracking = Some(tracking);
self
}
pub fn with_scheduled_at(mut self, scheduled_at: impl Into<String>) -> Self {
self.scheduled_at = Some(scheduled_at.into());
self
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Attachment {
pub filename: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
}
impl Attachment {
pub fn new(filename: impl Into<String>, content: impl Into<String>) -> Self {
Self {
filename: filename.into(),
content: content.into(),
content_type: None,
}
}
pub fn with_content_type(mut self, content_type: impl Into<String>) -> Self {
self.content_type = Some(content_type.into());
self
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Tracking {
#[serde(skip_serializing_if = "Option::is_none")]
pub loads: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub clicks: Option<bool>,
}
impl Tracking {
pub fn new() -> Self {
Self {
loads: None,
clicks: None,
}
}
pub fn with_loads(mut self, loads: bool) -> Self {
self.loads = Some(loads);
self
}
pub fn with_clicks(mut self, clicks: bool) -> Self {
self.clicks = Some(clicks);
self
}
}
impl Default for Tracking {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Deserialize)]
pub struct Email {
pub id: Option<String>,
pub object: Option<String>,
#[serde(rename = "type")]
pub email_type: Option<String>,
pub token: Option<String>,
pub message_id: Option<String>,
pub from: Option<String>,
pub to: Option<Value>,
pub cc: Option<Value>,
pub bcc: Option<Value>,
pub subject: Option<String>,
pub status: Option<String>,
pub size: Option<Value>,
pub scheduled_at: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub tracking: Option<Value>,
pub meta: Option<Value>,
pub headers: Option<Value>,
pub body: Option<Value>,
pub raw: Option<Value>,
pub attachments: Option<Value>,
pub ids: Option<Value>,
pub original_id: Option<String>,
pub message: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct EmailBody {
pub text: Option<String>,
pub html: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct ListEmailsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
}
#[derive(Debug, Serialize)]
pub struct UpdateEmailParams {
pub scheduled_at: String,
}
#[derive(Debug, Serialize)]
pub struct CreateDomainParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_loads: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_clicks: Option<bool>,
}
impl CreateDomainParams {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
track_loads: None,
track_clicks: None,
}
}
pub fn with_track_loads(mut self, track_loads: bool) -> Self {
self.track_loads = Some(track_loads);
self
}
pub fn with_track_clicks(mut self, track_clicks: bool) -> Self {
self.track_clicks = Some(track_clicks);
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateDomainParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub track_loads: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_clicks: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct Domain {
pub id: Option<String>,
pub object: Option<String>,
pub uuid: Option<String>,
pub name: Option<String>,
pub verification_token: Option<String>,
pub verification_method: Option<String>,
pub verified_at: Option<Value>,
pub dkim_identifier_string: Option<String>,
pub dns_checked_at: Option<Value>,
pub spf_status: Option<String>,
pub spf_error: Option<Value>,
pub dkim_status: Option<String>,
pub dkim_error: Option<Value>,
pub mx_status: Option<String>,
pub mx_error: Option<Value>,
pub return_path_status: Option<String>,
pub return_path_error: Option<Value>,
pub dmarc_status: Option<String>,
pub dmarc_error: Option<Value>,
pub tracking_status: Option<String>,
pub tracking_error: Option<Value>,
pub inbound_status: Option<String>,
pub inbound_error: Option<Value>,
pub track_loads: Option<bool>,
pub track_clicks: Option<bool>,
pub dns_records: Option<Value>,
pub deleted: Option<bool>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct CreateApiKeyParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sending_domain_id: Option<String>,
}
impl CreateApiKeyParams {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
scope: None,
sending_domain_id: None,
}
}
pub fn with_scope(mut self, scope: impl Into<String>) -> Self {
self.scope = Some(scope.into());
self
}
pub fn with_sending_domain_id(mut self, id: impl Into<String>) -> Self {
self.sending_domain_id = Some(id.into());
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateApiKeyParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sending_domain_id: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct ApiKey {
pub id: Option<String>,
pub object: Option<String>,
pub name: Option<String>,
pub scope: Option<String>,
pub sending_domain_id: Option<Value>,
pub key: Option<String>,
pub last_used_at: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct CreateAudienceParams {
pub name: String,
}
impl CreateAudienceParams {
pub fn new(name: impl Into<String>) -> Self {
Self { name: name.into() }
}
}
#[derive(Debug, Serialize)]
pub struct UpdateAudienceParams {
pub name: String,
}
#[derive(Debug, Deserialize)]
pub struct Audience {
pub id: Option<String>,
pub object: Option<String>,
pub name: Option<String>,
pub token: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct CreateSubscriberParams {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<HashMap<String, Value>>,
}
impl CreateSubscriberParams {
pub fn new(email: impl Into<String>) -> Self {
Self {
email: email.into(),
first_name: None,
last_name: None,
custom_fields: None,
}
}
pub fn with_first_name(mut self, first_name: impl Into<String>) -> Self {
self.first_name = Some(first_name.into());
self
}
pub fn with_last_name(mut self, last_name: impl Into<String>) -> Self {
self.last_name = Some(last_name.into());
self
}
pub fn with_custom_fields(mut self, fields: HashMap<String, Value>) -> Self {
self.custom_fields = Some(fields);
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateSubscriberParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscribed: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct ListSubscribersParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscribed: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct Subscriber {
pub id: Option<String>,
pub object: Option<String>,
pub audience_id: Option<String>,
pub contact_id: Option<String>,
pub email: Option<String>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub custom_fields: Option<Value>,
pub subscribed: Option<bool>,
pub subscribed_at: Option<Value>,
pub unsubscribed_at: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct CreateTemplateParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub subject: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
}
impl CreateTemplateParams {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
subject: None,
from: None,
reply_to: None,
html: None,
text: None,
}
}
pub fn with_subject(mut self, subject: impl Into<String>) -> Self {
self.subject = Some(subject.into());
self
}
pub fn with_from(mut self, from: impl Into<String>) -> Self {
self.from = Some(from.into());
self
}
pub fn with_reply_to(mut self, reply_to: impl Into<String>) -> Self {
self.reply_to = Some(reply_to.into());
self
}
pub fn with_html(mut self, html: impl Into<String>) -> Self {
self.html = Some(html.into());
self
}
pub fn with_text(mut self, text: impl Into<String>) -> Self {
self.text = Some(text.into());
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateTemplateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subject: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Template {
pub id: Option<String>,
pub object: Option<String>,
pub name: Option<String>,
pub alias: Option<String>,
pub from: Option<String>,
pub subject: Option<String>,
pub reply_to: Option<String>,
pub html: Option<String>,
pub text: Option<String>,
pub editor: Option<String>,
pub published_at: Option<Value>,
pub preview_url: Option<String>,
pub total_versions: Option<i64>,
pub versions: Option<Value>,
pub message: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct CreateSuppressionParams {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub suppression_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
impl CreateSuppressionParams {
pub fn new(email: impl Into<String>) -> Self {
Self {
email: email.into(),
suppression_type: None,
reason: None,
}
}
pub fn with_type(mut self, suppression_type: impl Into<String>) -> Self {
self.suppression_type = Some(suppression_type.into());
self
}
pub fn with_reason(mut self, reason: impl Into<String>) -> Self {
self.reason = Some(reason.into());
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateSuppressionParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keep_until: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Suppression {
pub id: Option<String>,
pub object: Option<String>,
pub email: Option<String>,
#[serde(rename = "type")]
pub suppression_type: Option<String>,
pub reason: Option<String>,
pub timestamp: Option<Value>,
pub keep_until: Option<Value>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct VerifyEmailParams {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<String>,
}
impl VerifyEmailParams {
pub fn new(email: impl Into<String>) -> Self {
Self {
email: email.into(),
mode: None,
}
}
pub fn with_mode(mut self, mode: impl Into<String>) -> Self {
self.mode = Some(mode.into());
self
}
}
#[derive(Debug, Deserialize)]
pub struct EmailVerification {
pub id: Option<String>,
pub object: Option<String>,
pub email: Option<String>,
pub status: Option<String>,
pub score: Option<f64>,
pub risk: Option<String>,
pub result: Option<String>,
pub mode: Option<String>,
pub checks: Option<Value>,
pub address: Option<Value>,
pub did_you_mean: Option<Value>,
pub mx_records: Option<Value>,
}
#[derive(Debug, Serialize)]
pub struct CreateEmailVerificationListParams {
pub name: String,
pub emails: Vec<String>,
}
impl CreateEmailVerificationListParams {
pub fn new(
name: impl Into<String>,
emails: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
Self {
name: name.into(),
emails: emails.into_iter().map(|e| e.into()).collect(),
}
}
}
#[derive(Debug, Serialize)]
pub struct ListEmailVerificationListsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
}
#[derive(Debug, Serialize)]
pub struct EmailVerificationListResultsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
}
#[derive(Debug, Deserialize)]
pub struct EmailVerificationList {
pub id: Option<String>,
pub object: Option<String>,
pub name: Option<String>,
pub status: Option<String>,
pub stats: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct CreateWebhookParams {
pub name: String,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_events: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub events: Option<Vec<String>>,
}
impl CreateWebhookParams {
pub fn new(name: impl Into<String>, url: impl Into<String>) -> Self {
Self {
name: name.into(),
url: url.into(),
all_events: None,
enabled: None,
events: None,
}
}
pub fn with_all_events(mut self, all_events: bool) -> Self {
self.all_events = Some(all_events);
self
}
pub fn with_enabled(mut self, enabled: bool) -> Self {
self.enabled = Some(enabled);
self
}
pub fn with_events(mut self, events: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.events = Some(events.into_iter().map(|e| e.into()).collect());
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateWebhookParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_events: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub events: Option<Vec<String>>,
}
#[derive(Debug, Deserialize)]
pub struct Webhook {
pub id: Option<String>,
pub object: Option<String>,
pub name: Option<String>,
pub url: Option<String>,
pub all_events: Option<bool>,
pub enabled: Option<bool>,
pub events: Option<Value>,
pub last_used_at: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct CreateContactParams {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<HashMap<String, Value>>,
}
impl CreateContactParams {
pub fn new(email: impl Into<String>) -> Self {
Self {
email: email.into(),
first_name: None,
last_name: None,
custom_fields: None,
}
}
pub fn with_first_name(mut self, first_name: impl Into<String>) -> Self {
self.first_name = Some(first_name.into());
self
}
pub fn with_last_name(mut self, last_name: impl Into<String>) -> Self {
self.last_name = Some(last_name.into());
self
}
pub fn with_custom_fields(mut self, fields: HashMap<String, Value>) -> Self {
self.custom_fields = Some(fields);
self
}
}
#[derive(Debug, Serialize)]
pub struct UpdateContactParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unsubscribed: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct Contact {
pub id: Option<String>,
pub object: Option<String>,
pub email: Option<String>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub custom_fields: Option<Value>,
pub unsubscribed: Option<bool>,
pub audiences: Option<Value>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub deleted: Option<bool>,
}
#[derive(Debug, Serialize)]
pub struct ListEventsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub event_type: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Event {
pub id: Option<String>,
pub object: Option<String>,
#[serde(rename = "type")]
pub event_type: Option<String>,
pub data: Option<Value>,
pub created_at: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct WebhookEvent {
#[serde(rename = "type")]
pub event_type: String,
pub data: Option<Value>,
pub event_id: Option<String>,
pub timestamp: Option<Value>,
}
#[derive(Debug, Serialize)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
}
impl ListParams {
pub fn new() -> Self {
Self {
page: None,
limit: None,
}
}
}
impl Default for ListParams {
fn default() -> Self {
Self::new()
}
}