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
use reqwest::Method;

use crate::api::{decode_response, ErrorKind};
use crate::client::Client;
use crate::error::Error;
use crate::models::send::{SmsRequest, SmsResponse};

impl Client {
    /// Sends one or more SMS messages.
    ///
    /// Wraps `POST /sms/3/messages` — the latest send endpoint, which
    /// supersedes the deprecated `/sms/2/text/advanced` and
    /// `/sms/2/binary/advanced`. Both text and binary content variants
    /// are handled by this single method via
    /// [`SmsMessageContent`](crate::models::send::SmsMessageContent).
    ///
    /// # Bulk sends
    ///
    /// One call can fan out to thousands of recipients: each
    /// [`SmsMessage`](crate::models::send::SmsMessage) can target many
    /// destinations, and the request can carry many messages. To
    /// schedule a send for the future, set
    /// [`SmsRequestOptions::schedule`](crate::models::send::SmsRequestOptions::schedule).
    ///
    /// # Errors
    ///
    /// On non-2xx responses, returns
    /// [`Error::Api`] (the v3 endpoint family uses the rich `ApiError`
    /// schema).
    ///
    /// # Example
    ///
    /// ```no_run
    /// # use infobip_sms::Client;
    /// use infobip_sms::models::send::{
    ///     SmsMessage, SmsMessageContent, SmsRequest, SmsTextMessageContent, SmsToDestination,
    /// };
    ///
    /// # async fn run(client: Client) -> Result<(), infobip_sms::Error> {
    /// let response = client
    ///     .send_messages(&SmsRequest {
    ///         messages: vec![SmsMessage {
    ///             sender: Some("InfoSMS".into()),
    ///             destinations: vec![SmsToDestination {
    ///                 to: "41793026727".into(),
    ///                 ..Default::default()
    ///             }],
    ///             content: SmsMessageContent::Text(SmsTextMessageContent {
    ///                 text: "Hi!".into(),
    ///                 ..Default::default()
    ///             }),
    ///             ..Default::default()
    ///         }],
    ///         options: None,
    ///     })
    ///     .await?;
    ///
    /// println!("Bulk ID: {:?}", response.bulk_id);
    /// # Ok(()) }
    /// ```
    pub async fn send_messages(&self, request: &SmsRequest) -> Result<SmsResponse, Error> {
        let response = self
            .request(Method::POST, "sms/3/messages")?
            .json(request)
            .send()
            .await?;
        decode_response(response, ErrorKind::Rich).await
    }
}