whatsapp_cloud_api/models/
message.rs

1use serde::{Deserialize, Serialize};
2
3use crate::WHATSAPP;
4
5use super::{
6    image_message::Image, interactive_message::Interactive, template_message::Template,
7    text_message::Text,
8};
9
10#[derive(Deserialize, Serialize, Debug, Clone)]
11pub struct Message {
12    biz_opaque_callback_data: Option<String>,
13    context: Option<Context>,
14    image: Option<Image>,
15    interactive: Option<Interactive>,
16    messaging_product: String,
17    recipient_type: Option<String>,
18    status: Option<StatusCode>,
19
20    template: Option<Template>,
21    text: Option<Text>,
22    to: String,
23
24    #[serde(rename = "type")]
25    message_type: Option<MessageType>,
26}
27
28#[derive(Deserialize, Serialize, Debug, Clone)]
29#[serde(rename_all = "snake_case")]
30pub enum MessageType {
31    Image,
32    Interactive,
33    Text,
34    Template,
35}
36
37impl Message {
38    pub fn from_text(to: &str, text: Text, context: Option<Context>) -> Self {
39        Self {
40            biz_opaque_callback_data: None,
41            context,
42            image: None,
43            interactive: None,
44            messaging_product: WHATSAPP.into(),
45            recipient_type: None,
46            status: None,
47            message_type: Some(MessageType::Text),
48            template: None,
49            text: Some(text),
50            to: to.into(),
51        }
52    }
53
54    pub fn from_template(to: &str, template: Template, context: Option<Context>) -> Self {
55        Self {
56            biz_opaque_callback_data: None,
57            context,
58            image: None,
59            interactive: None,
60            messaging_product: WHATSAPP.into(),
61            recipient_type: None,
62            status: None,
63            message_type: Some(MessageType::Template),
64            template: Some(template),
65            text: None,
66            to: to.into(),
67        }
68    }
69
70    pub fn from_interactive(to: &str, interactive: Interactive, context: Option<Context>) -> Self {
71        Self {
72            biz_opaque_callback_data: None,
73            context,
74            image: None,
75            interactive: Some(interactive),
76            messaging_product: WHATSAPP.into(),
77            recipient_type: None,
78            status: None,
79            message_type: Some(MessageType::Interactive),
80            template: None,
81            text: None,
82            to: to.into(),
83        }
84    }
85
86    pub fn from_image(to: &str, image: Image, context: Option<Context>) -> Self {
87        Self {
88            biz_opaque_callback_data: None,
89            context,
90            image: Some(image),
91            interactive: None,
92            messaging_product: WHATSAPP.into(),
93            recipient_type: None,
94            status: None,
95            message_type: Some(MessageType::Image),
96            template: None,
97            text: None,
98            to: to.into(),
99        }
100    }
101}
102
103#[derive(Clone, Debug, Serialize, Deserialize)]
104pub struct Context {
105    pub message_id: String,
106}
107
108impl Context {
109    pub fn new(message_id: &str) -> Self {
110        Self {
111            message_id: message_id.into(),
112        }
113    }
114}
115
116#[derive(Deserialize, Serialize, Debug, Clone)]
117#[serde(rename_all = "snake_case")]
118pub enum StatusCode {
119    Delivered,
120    Read,
121    Sent,
122    Failed,
123}
124
125#[derive(Deserialize, Serialize, Debug, Clone)]
126pub struct MessageStatus {
127    messaging_product: String,
128    message_id: String,
129    status: StatusCode,
130}
131
132impl MessageStatus {
133    pub fn for_read(message_id: &str) -> Self {
134        Self {
135            messaging_product: WHATSAPP.into(),
136            message_id: message_id.into(),
137            status: StatusCode::Read,
138        }
139    }
140}