infobip-sms-sdk 0.1.0

Async Rust SDK for the Infobip SMS API: send messages, manage scheduled bulks, query delivery reports and logs, fetch inbound SMS, and parse webhook payloads.
Documentation
//! Models for managing scheduled bulk sends.
//!
//! These cover both `/sms/1/bulks` (reschedule a pending bulk) and
//! `/sms/1/bulks/status` (pause / resume / cancel a pending bulk).
//!
//! Every operation is keyed on a bulk ID — either one you set yourself
//! via
//! [`crate::models::send::RequestSchedulingSettings::bulk_id`], or one
//! the API auto-assigned and returned in
//! [`crate::models::send::SmsResponse::bulk_id`].
//!
//! # Examples
//!
//! ## Pausing a scheduled bulk
//!
//! ```no_run
//! # use infobip_sms::Client;
//! use infobip_sms::models::bulks::UpdateBulkStatusRequest;
//! use infobip_sms::models::common::BulkStatus;
//!
//! # async fn run(client: Client, bulk_id: &str) -> Result<(), infobip_sms::Error> {
//! client
//!     .update_bulk_status(bulk_id, &UpdateBulkStatusRequest { status: BulkStatus::Paused })
//!     .await?;
//! # Ok(()) }
//! ```
//!
//! ## Rescheduling a bulk
//!
//! ```no_run
//! # use infobip_sms::Client;
//! use infobip_sms::models::bulks::RescheduleBulkRequest;
//!
//! # async fn run(client: Client, bulk_id: &str) -> Result<(), infobip_sms::Error> {
//! client
//!     .reschedule_bulk(
//!         bulk_id,
//!         &RescheduleBulkRequest {
//!             send_at: "2026-12-24T09:00:00.000+0000".into(),
//!         },
//!     )
//!     .await?;
//! # Ok(()) }
//! ```

use serde::{Deserialize, Serialize};

use crate::models::common::BulkStatus;

/// Returned by `GET /sms/1/bulks` and `PUT /sms/1/bulks`.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BulkResponse {
    /// The bulk ID that was queried.
    pub bulk_id: Option<String>,
    /// Current scheduled dispatch time
    /// (`yyyy-MM-dd'T'HH:mm:ss.SSSZ`).
    pub send_at: Option<String>,
}

/// Body of `PUT /sms/1/bulks?bulkId=...` — reschedule a pending bulk.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RescheduleBulkRequest {
    /// New dispatch time. Format `yyyy-MM-dd'T'HH:mm:ss.SSSZ`.
    pub send_at: String,
}

/// Returned by `GET /sms/1/bulks/status` and `PUT /sms/1/bulks/status`.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BulkStatusResponse {
    /// The bulk ID that was queried.
    pub bulk_id: Option<String>,
    /// Current lifecycle status.
    pub status: Option<BulkStatus>,
}

/// Body of `PUT /sms/1/bulks/status?bulkId=...` — pause, resume, or
/// cancel.
///
/// Allowed transitions:
/// - `Pending` → `Paused`
/// - `Paused` → `Pending`
/// - `Pending` or `Paused` → `Canceled` (terminal)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateBulkStatusRequest {
    /// Target status.
    pub status: BulkStatus,
}