use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
pub type Object = Map<String, Value>;
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CursorInfo {
pub cursor: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(default)]
pub struct NamedRef {
pub id: String,
pub name: String,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SendEmailParams {
pub from: String,
pub to: 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_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<Object>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_class: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_opens: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_clicks: Option<bool>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SentEmail {
pub id: String,
pub message_id: String,
pub ses_message_id: Option<String>,
pub from: String,
pub to: String,
pub domain: String,
pub subject: String,
pub status: String,
pub created_at: String,
pub template_id: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct BatchItemError {
pub code: String,
pub message: String,
pub detail: Option<Value>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct BatchResult {
pub index: u32,
pub status: String,
pub id: Option<String>,
pub message_id: Option<String>,
pub error: Option<BatchItemError>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct BatchSummary {
pub submitted: u32,
pub accepted: u32,
pub failed: u32,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct SendBatchResponse {
pub data: Vec<BatchResult>,
pub summary: BatchSummary,
}
#[derive(Debug, Clone, Default)]
pub struct ListEmailsParams {
pub search: Option<String>,
pub status: Option<String>,
pub domain: Option<String>,
pub broadcast_id: Option<String>,
pub from: Option<String>,
pub to: Option<String>,
pub page: Option<u32>,
pub page_size: Option<u32>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EmailRow {
pub id: String,
pub message_id: String,
pub from: String,
pub to: String,
pub domain: String,
pub subject: String,
pub status: String,
pub ses_message_id: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EmailList {
pub items: Vec<EmailRow>,
pub total: u64,
pub page: u32,
pub page_size: u32,
pub total_capped: bool,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EmailEvent {
pub id: String,
#[serde(rename = "type")]
pub kind: String,
pub meta: Value,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EmailDetail {
#[serde(flatten)]
pub row: EmailRow,
pub html: Option<String>,
pub text: Option<String>,
pub body_expired: bool,
pub events: Vec<EmailEvent>,
pub thread_id: Option<String>,
pub send_class: Option<String>,
pub track_opens: Option<bool>,
pub track_clicks: Option<bool>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EmailStats {
pub total: u64,
pub queued: u64,
pub sent: u64,
pub delivered: u64,
pub opened: u64,
pub clicked: u64,
pub bounced: u64,
pub complained: u64,
pub failed: u64,
pub body_retention_days: u32,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Domain {
pub id: String,
pub name: String,
pub region: String,
pub status: String,
pub spf_ok: bool,
pub dkim_ok: bool,
pub dmarc_ok: bool,
pub records: Vec<DomainCheck>,
pub sent: u64,
pub check_count: u32,
pub last_checked_at: Option<String>,
pub created_at: String,
pub last_error: Option<String>,
pub receiving_enabled: bool,
pub mx_ok: bool,
pub receiving_verified: bool,
pub receiving_error: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct DomainCheck {
pub name: String,
pub ok: bool,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct DnsRecord {
#[serde(rename = "type")]
pub kind: String,
pub purpose: String,
pub host: String,
pub value: String,
pub copy_value: Option<String>,
pub priority: Option<u32>,
pub status: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct DomainRecords {
pub domain: Domain,
pub records: Vec<DnsRecord>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct CreateDomainParams {
pub name: String,
pub region: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct TemplateTag {
pub id: String,
pub name: String,
pub color: String,
pub template_count: Option<u32>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct TemplateSummary {
pub id: String,
pub public_id: String,
pub name: String,
pub status: String,
pub block_count: u32,
pub updated_at: String,
pub published_at: Option<String>,
pub created_at: String,
pub domains: Vec<NamedRef>,
pub tags: Vec<TemplateTag>,
pub key: Option<String>,
pub project: Option<NamedRef>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Template {
#[serde(flatten)]
pub summary: TemplateSummary,
pub subject: String,
pub preheader: String,
pub blocks: Vec<Object>,
pub html: String,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TemplateParams {
#[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 preheader: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocks: Option<Vec<Object>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub project_domain_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ListTemplatesParams {
pub tag: Option<String>,
pub project: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct TemplatePreview {
pub subject: String,
pub preheader: String,
pub html: String,
pub text: String,
pub variables: Vec<PreviewVariable>,
pub unsafe_links: Vec<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct PreviewVariable {
pub name: String,
pub fallback: Option<String>,
pub value: String,
pub provided: bool,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct TemplateAsset {
pub id: String,
pub public_id: String,
pub url: String,
pub mime_type: String,
pub bytes: u64,
pub name: String,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Sandbox {
pub id: String,
pub name: String,
pub slug: String,
pub inbox_address: String,
pub inbound_live: bool,
pub project_label: String,
pub color: String,
pub total: u64,
pub unread: u64,
pub message_cap: u32,
pub retention_days: u32,
pub last_trapped_at: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SandboxParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub project_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SandboxCredentials {
pub host: String,
pub port: u16,
pub tls: String,
pub max_recipients: u32,
pub username: String,
pub password: String,
pub max_message_bytes: u64,
pub retention_days: u32,
pub api_endpoint: String,
pub inbox_id: String,
pub inbox_address: String,
pub inbound_domain: String,
pub inbound_live: bool,
pub api_token_hint: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct ResetSandboxCredentials {
pub username: String,
pub password: String,
pub api_token: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SandboxMessageSummary {
pub id: String,
pub subject: String,
pub from_address: String,
pub from_name: String,
pub to_addresses: Vec<String>,
pub snippet: String,
pub size_bytes: u64,
pub read: bool,
pub trapped_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SandboxMessage {
#[serde(flatten)]
pub summary: SandboxMessageSummary,
pub cc_addresses: Vec<String>,
pub envelope_from: String,
pub envelope_to: Vec<String>,
pub body_html: Option<String>,
pub body_text: Option<String>,
pub headers: Vec<MessageHeader>,
pub transport: String,
pub client_ip: Option<String>,
pub has_raw: bool,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct MessageHeader {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, Default)]
pub struct ListSandboxMessagesParams {
pub search: Option<String>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct SandboxSendResult {
pub id: String,
pub duplicate: bool,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct WebhookEndpoint {
pub id: String,
pub url: String,
pub events: Vec<String>,
pub active: bool,
pub created_at: String,
pub secret_masked: String,
pub secret_rotated_at: Option<String>,
pub previous_secret_expires_at: Option<String>,
pub success_rate: Option<f64>,
pub success_rate_window_days: u32,
pub delivery_count: u64,
pub delivered_count: u64,
pub secret: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WebhookParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub events: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_insecure_http: Option<bool>,
}
#[derive(Debug, Clone, Default)]
pub struct ListWebhookDeliveriesParams {
pub endpoint_id: Option<String>,
pub final_only: Option<bool>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Default)]
pub struct ListWebhookDispatchesParams {
pub state: Option<String>,
pub endpoint_id: Option<String>,
pub cursor: Option<String>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct WebhookDispatch {
pub id: String,
pub endpoint_id: String,
pub endpoint_url: String,
pub event_id: String,
pub event: String,
pub state: String,
pub attempts: u32,
pub last_status_code: Option<u16>,
pub last_error: Option<String>,
pub last_attempt_error: Option<String>,
pub first_attempt_at: Option<String>,
pub last_attempt_at: Option<String>,
pub next_attempt_at: Option<String>,
pub created_at: String,
pub replayed_at: Option<String>,
pub replay_count: u32,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct WebhookDispatchPage {
pub data: Vec<WebhookDispatch>,
pub page: CursorInfo,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct ReplayAllResult {
pub queued: u32,
pub remaining: u32,
pub capped: bool,
pub max: u32,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct WebhookEvent {
pub id: String,
pub event: String,
pub created_at: String,
pub data: Object,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Contact {
pub id: String,
pub name: String,
pub email: String,
pub status: String,
pub audience_id: Option<String>,
pub audience_name: Option<String>,
pub audience_color: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct ContactList {
pub items: Vec<Contact>,
pub total: u64,
pub page: u32,
pub page_size: u32,
pub total_pages: u32,
pub total_all: u64,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateContactParams {
pub name: String,
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub audience_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ListContactsParams {
pub audience_id: Option<String>,
pub status: Option<String>,
pub page: Option<u32>,
pub page_size: Option<u32>,
}
#[derive(Debug, Clone, Default)]
pub struct ImportContactsParams {
pub file: Vec<u8>,
pub filename: Option<String>,
pub audience_id: Option<String>,
pub new_audience: Option<String>,
pub create_audiences: Option<bool>,
pub on_duplicate: Option<String>,
pub mapping: Option<Object>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct Audience {
pub id: String,
pub name: String,
pub color: String,
pub count: u64,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct AudienceList {
pub audiences: Vec<Audience>,
pub total_contacts: u64,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Suppression {
pub id: String,
pub email: String,
pub reason: String,
pub reason_label: String,
pub reason_detail: Option<String>,
pub diagnostic_code: Option<String>,
pub scope: String,
pub source_email_id: Option<String>,
pub source_message_id: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct SuppressionList {
pub data: Vec<Suppression>,
pub page: CursorInfo,
pub counts: SuppressionCounts,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct SuppressionCounts {
pub total: u64,
pub by_reason: std::collections::BTreeMap<String, u64>,
}
#[derive(Debug, Clone, Default)]
pub struct ListSuppressionsParams {
pub q: Option<String>,
pub reason: Option<String>,
pub cursor: Option<String>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default)]
pub struct SuppressionCreated {
pub created: bool,
pub row: Option<Suppression>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Mailbox {
pub id: String,
pub address: String,
pub display_name: String,
pub domain: String,
pub domain_id: String,
pub catch_all: bool,
pub archived: bool,
pub can_receive: bool,
pub can_send: bool,
pub unread: u64,
pub total: u64,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MailboxParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_part: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub catch_all: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_owner: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub embed_origins: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default)]
pub struct ListMailboxMessagesParams {
pub folder: Option<String>,
pub search: Option<String>,
pub label: Option<String>,
pub limit: Option<u32>,
pub cursor: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MailboxMessageRow {
pub id: String,
pub folder: String,
pub from: String,
pub from_name: String,
pub to: String,
pub cc: Option<String>,
pub bcc: Option<String>,
pub subject: String,
pub snippet: String,
pub label: Option<String>,
pub unread: bool,
pub starred: bool,
pub received_at: String,
pub mailbox_id: Option<String>,
pub thread_id: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MailboxMessageList {
pub items: Vec<MailboxMessageRow>,
pub total: u64,
pub unread: u64,
pub total_capped: bool,
pub page: CursorInfo,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MailboxMessage {
#[serde(flatten)]
pub row: MailboxMessageRow,
pub body_text: Option<String>,
pub body_html: Option<String>,
pub body_expired_at: Option<String>,
pub thread: Option<Object>,
pub attachments: Vec<MailboxAttachment>,
pub authentication: Option<Object>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MailboxAttachment {
pub id: String,
pub filename: String,
pub content_type: String,
pub size_bytes: u64,
}
#[derive(Debug, Clone, Default)]
pub struct DownloadedFile {
pub content: Vec<u8>,
pub content_type: Option<String>,
pub filename: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Workspace {
pub id: String,
pub name: String,
pub public_id: String,
pub created_at: String,
pub sending_paused: Option<Object>,
pub postal_address: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct ApiKey {
pub id: String,
pub name: String,
pub masked: String,
pub prefix: String,
pub last4: String,
pub permission: String,
pub domain_id: Option<String>,
pub domain: Option<String>,
pub created_at: String,
pub last_used_at: Option<String>,
}