whatsapp_cloud_api/models/
message.rs1use 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}