emailit 2.0.3

The official Rust SDK for the Emailit Email API
Documentation
//! Subscriber management within audiences.

use std::sync::Arc;

use crate::client::BaseClient;
use crate::collection::Collection;
use crate::error::Error;
use crate::types::{
    CreateSubscriberParams, ListSubscribersParams, Subscriber, UpdateSubscriberParams,
};

/// Service for managing subscribers within an audience.
///
/// Accessed via [`Emailit::subscribers`](crate::Emailit::subscribers).
/// All methods require the parent `audience_id`.
pub struct SubscriberService {
    pub(crate) client: Arc<BaseClient>,
}

impl SubscriberService {
    /// Adds a subscriber to an audience.
    ///
    /// `POST /v2/audiences/:audience_id/subscribers`
    pub async fn create(
        &self,
        audience_id: &str,
        params: CreateSubscriberParams,
    ) -> Result<Subscriber, Error> {
        let path = format!(
            "/v2/audiences/{}/subscribers",
            urlencoding::encode(audience_id)
        );
        self.client
            .request("POST", &path, to_body(&params), None)
            .await
    }

    /// Retrieves a subscriber by ID within an audience.
    ///
    /// `GET /v2/audiences/:audience_id/subscribers/:id`
    pub async fn get(&self, audience_id: &str, id: &str) -> Result<Subscriber, Error> {
        let path = format!(
            "/v2/audiences/{}/subscribers/{}",
            urlencoding::encode(audience_id),
            urlencoding::encode(id)
        );
        self.client.request("GET", &path, None, None).await
    }

    /// Updates a subscriber within an audience.
    ///
    /// `POST /v2/audiences/:audience_id/subscribers/:id`
    pub async fn update(
        &self,
        audience_id: &str,
        id: &str,
        params: UpdateSubscriberParams,
    ) -> Result<Subscriber, Error> {
        let path = format!(
            "/v2/audiences/{}/subscribers/{}",
            urlencoding::encode(audience_id),
            urlencoding::encode(id)
        );
        self.client
            .request("POST", &path, to_body(&params), None)
            .await
    }

    /// Lists subscribers in an audience with optional pagination and filters.
    ///
    /// `GET /v2/audiences/:audience_id/subscribers`
    pub async fn list(
        &self,
        audience_id: &str,
        params: Option<ListSubscribersParams>,
    ) -> Result<Collection<Subscriber>, Error> {
        let path = format!(
            "/v2/audiences/{}/subscribers",
            urlencoding::encode(audience_id)
        );
        let query = params.map(|p| {
            let mut q = Vec::new();
            if let Some(page) = p.page {
                q.push(("page", page.to_string()));
            }
            if let Some(limit) = p.limit {
                q.push(("limit", limit.to_string()));
            }
            if let Some(subscribed) = p.subscribed {
                q.push(("subscribed", subscribed.to_string()));
            }
            q
        });
        self.client
            .request::<Collection<Subscriber>>("GET", &path, None, query.as_deref())
            .await
    }

    /// Removes a subscriber from an audience.
    ///
    /// `DELETE /v2/audiences/:audience_id/subscribers/:id`
    pub async fn delete(&self, audience_id: &str, id: &str) -> Result<Subscriber, Error> {
        let path = format!(
            "/v2/audiences/{}/subscribers/{}",
            urlencoding::encode(audience_id),
            urlencoding::encode(id)
        );
        self.client.request("DELETE", &path, None, None).await
    }
}

fn to_body(v: &impl serde::Serialize) -> Option<serde_json::Value> {
    serde_json::to_value(v).ok()
}