use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub struct KeplarsConfig {
pub api_key: String,
pub base_url: String,
pub timeout: std::time::Duration,
pub max_retries: u32,
pub retry_delay: std::time::Duration,
}
impl Default for KeplarsConfig {
fn default() -> Self {
Self {
api_key: String::new(),
base_url: "https://api.keplars.com".to_string(),
timeout: std::time::Duration::from_secs(30),
max_retries: 3,
retry_delay: std::time::Duration::from_secs(1),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ToRecipient {
Email(String),
Recipients(Vec<EmailRecipient>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmailRecipient {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SendEmailRequest {
pub to: ToRecipient,
pub from: String,
pub subject: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cc: Option<Vec<EmailRecipient>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bcc: Option<Vec<EmailRecipient>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_data: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize)]
pub struct ScheduleEmailRequest {
#[serde(flatten)]
pub email: SendEmailRequest,
pub scheduled_for: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SendEmailData {
pub job_id: String,
pub priority: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SendEmailResponse {
pub success: bool,
pub message: String,
pub data: SendEmailData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Contact {
pub id: String,
pub email: String,
pub name: Option<String>,
pub audience_id: Option<String>,
pub created_at: String,
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct AddContactRequest {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audience_id: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdateContactRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audience_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Audience {
pub id: String,
pub name: String,
pub description: Option<String>,
pub created_at: String,
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Automation {
pub id: String,
pub name: String,
pub status: String,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DomainListItem {
pub id: String,
pub domain: String,
pub verified: bool,
pub created_at: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ApiResponse<T> {
pub success: bool,
pub message: String,
pub data: T,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ApiDataResponse<T> {
pub success: bool,
pub data: T,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ApiListResponse<T> {
pub success: bool,
pub data: Vec<T>,
pub meta: HashMap<String, Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ApiMessageResponse {
pub success: bool,
pub message: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct RateLimitInfo {
pub limit: u32,
pub remaining: u32,
pub reset: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateDomainData {
pub domain_id: String,
pub domain: String,
pub dns_records: Vec<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DomainStatusData {
pub domain_id: String,
pub domain: String,
pub verified: bool,
pub dns_records: Vec<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DomainVerificationData {
pub verified: bool,
pub domain: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DomainApiKeyData {
pub api_key: String,
pub domain_id: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateDomainApiKeyRequest {
pub domain_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}