pub mod client;
pub mod error;
pub mod markup;
pub mod resources;
pub mod types;
pub use client::{Client, SevkOptions};
pub use error::Error;
pub use markup::{generate_email_from_markup, EmailHeadSettings};
pub struct Sevk {
client: Client,
}
impl Sevk {
pub fn new(api_key: &str) -> Self {
Self {
client: Client::new(api_key, SevkOptions::default()),
}
}
pub fn with_options(api_key: &str, options: SevkOptions) -> Self {
Self {
client: Client::new(api_key, options),
}
}
pub fn contacts(&self) -> resources::Contacts<'_> {
resources::Contacts::new(&self.client)
}
pub fn audiences(&self) -> resources::Audiences<'_> {
resources::Audiences::new(&self.client)
}
pub fn templates(&self) -> resources::Templates<'_> {
resources::Templates::new(&self.client)
}
pub fn broadcasts(&self) -> resources::Broadcasts<'_> {
resources::Broadcasts::new(&self.client)
}
pub fn domains(&self) -> resources::Domains<'_> {
resources::Domains::new(&self.client)
}
pub fn topics(&self) -> resources::Topics<'_> {
resources::Topics::new(&self.client)
}
pub fn segments(&self) -> resources::Segments<'_> {
resources::Segments::new(&self.client)
}
pub fn subscriptions(&self) -> resources::Subscriptions<'_> {
resources::Subscriptions::new(&self.client)
}
pub fn emails(&self) -> resources::Emails<'_> {
resources::Emails::new(&self.client)
}
pub fn webhooks(&self) -> resources::Webhooks<'_> {
resources::Webhooks::new(&self.client)
}
pub fn events(&self) -> resources::Events<'_> {
resources::Events::new(&self.client)
}
pub async fn get_usage(&self) -> Result<Usage, Error> {
self.client.get("/limits").await
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Usage {
pub id: String,
pub name: String,
#[serde(rename = "audienceLimit")]
pub audience_limit: i64,
#[serde(rename = "contactLimit")]
pub contact_limit: i64,
#[serde(rename = "broadcastLimit")]
pub broadcast_limit: i64,
#[serde(rename = "domainLimit")]
pub domain_limit: i64,
#[serde(rename = "storageLimit", deserialize_with = "deserialize_string_to_i64")]
pub storage_limit: i64,
#[serde(rename = "storageUsed", deserialize_with = "deserialize_string_to_i64")]
pub storage_used: i64,
#[serde(deserialize_with = "deserialize_string_to_f64")]
pub balance: f64,
#[serde(rename = "emailPrice", deserialize_with = "deserialize_string_to_f64")]
pub email_price: f64,
#[serde(rename = "emailStats")]
pub email_stats: EmailStatsData,
#[serde(rename = "emailLimits")]
pub email_limits: EmailLimitsData,
#[serde(rename = "_count")]
pub count: UsageCount,
}
fn deserialize_string_to_i64<'de, D>(deserializer: D) -> Result<i64, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de;
struct StringOrI64Visitor;
impl<'de> de::Visitor<'de> for StringOrI64Visitor {
type Value = i64;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a string or integer")
}
fn visit_i64<E: de::Error>(self, v: i64) -> Result<i64, E> { Ok(v) }
fn visit_u64<E: de::Error>(self, v: u64) -> Result<i64, E> { Ok(v as i64) }
fn visit_str<E: de::Error>(self, v: &str) -> Result<i64, E> {
v.parse().map_err(de::Error::custom)
}
}
deserializer.deserialize_any(StringOrI64Visitor)
}
fn deserialize_string_to_f64<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de;
struct StringOrF64Visitor;
impl<'de> de::Visitor<'de> for StringOrF64Visitor {
type Value = f64;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a string or number")
}
fn visit_f64<E: de::Error>(self, v: f64) -> Result<f64, E> { Ok(v) }
fn visit_i64<E: de::Error>(self, v: i64) -> Result<f64, E> { Ok(v as f64) }
fn visit_u64<E: de::Error>(self, v: u64) -> Result<f64, E> { Ok(v as f64) }
fn visit_str<E: de::Error>(self, v: &str) -> Result<f64, E> {
v.parse().map_err(de::Error::custom)
}
}
deserializer.deserialize_any(StringOrF64Visitor)
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct EmailStatsData {
pub total: i64,
pub marketing: i64,
pub transactional: i64,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct EmailLimitsData {
pub project: ProjectEmailLimits,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ProjectEmailLimits {
pub monthly: EmailLimitEntry,
pub rate: EmailLimitEntry,
#[serde(rename = "freeEmails")]
pub free_emails: EmailLimitEntry,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct EmailLimitEntry {
pub current: i64,
pub limit: i64,
pub remaining: i64,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct UsageCount {
pub audiences: i64,
pub contacts: i64,
pub broadcasts: i64,
pub domains: i64,
}