whatsapp-cloud-api 0.5.4

Whatsapp Cloud API Rust Client
Documentation
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Component {
    #[serde(rename = "type")]
    pub component_type: ComponentType,
    pub sub_type: Option<ComponentSubType>,
    pub parameters: Option<Vec<Parameter>>,
    pub index: Option<i32>,
}

impl Component {
    pub fn new(component_type: ComponentType) -> Self {
        Self {
            component_type,
            sub_type: None,
            parameters: None,
            index: None,
        }
    }

    pub fn with_parameters(component_type: ComponentType, parameters: Vec<Parameter>) -> Self {
        Self {
            component_type,
            sub_type: None,
            parameters: Some(parameters),
            index: None,
        }
    }

    pub fn for_button(
        component_type: ComponentType,
        sub_type: ComponentSubType,
        parameters: Vec<Parameter>,
        index: i32,
    ) -> Self {
        Self {
            component_type,
            sub_type: Some(sub_type),
            parameters: Some(parameters),
            index: Some(index),
        }
    }
}

#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum ComponentType {
    Header,
    Body,
    Button,
}

#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum ComponentSubType {
    QuickReply,
    Url,
    Catalog,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Parameter {
    #[serde(rename = "type")]
    pub parameter_type: ParameterType,
    pub text: Option<String>,
    pub currency: Option<Currency>,
    pub date_time: Option<String>,
    pub image: Option<Media>,
    pub document: Option<Media>,
    pub video: Option<Media>,
}

impl Parameter {
    pub fn from_text(text: &str) -> Self {
        Self {
            parameter_type: ParameterType::Text,
            text: Some(text.into()),
            currency: None,
            date_time: None,
            image: None,
            document: None,
            video: None,
        }
    }
}

#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum ParameterType {
    Currency,
    DateTime,
    Document,
    Image,
    Text,
    Video,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Currency {
    pub fallback_value: String,
    pub code: String,
    pub amount_1000: i32,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DateTime {
    pub fallback_value: String,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Media {
    pub id: Option<String>,
    pub link: Option<String>,
    pub caption: Option<String>,
    pub filename: Option<String>,
}