open_lark/service/im/v1/message/
builders.rs1use log::error;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 core::{
6 api_req::ApiRequest,
7 validation::{
8 message_limits, uuid_limits, validate_content_size, validate_required,
9 validate_string_length,
10 },
11 },
12 service::im::v1::message::{Message, SendMessageTrait},
13};
14
15use super::MessageService;
16
17#[derive(Debug, Clone, Default)]
19pub struct CreateMessageRequest {
20 pub api_req: ApiRequest,
21}
22
23impl CreateMessageRequest {
24 pub fn builder() -> CreateMessageRequestBuilder {
25 CreateMessageRequestBuilder::default()
26 }
27}
28
29#[derive(Default)]
30pub struct CreateMessageRequestBuilder {
31 request: CreateMessageRequest,
32}
33
34impl CreateMessageRequestBuilder {
35 pub fn receive_id(mut self, receive_id: impl ToString) -> Self {
40 self.request
41 .api_req
42 .query_params
43 .insert("receive_id", receive_id.to_string());
44 self
45 }
46
47 pub fn msg_type(mut self, msg_type: impl ToString) -> Self {
52 self.request
53 .api_req
54 .query_params
55 .insert("msg_type", msg_type.to_string());
56 self
57 }
58
59 pub fn content(mut self, content: impl ToString) -> Self {
64 self.request
65 .api_req
66 .query_params
67 .insert("content", content.to_string());
68 self
69 }
70
71 pub fn receive_id_type(mut self, receive_id_type: impl ToString) -> Self {
81 self.request
82 .api_req
83 .query_params
84 .insert("receive_id_type", receive_id_type.to_string());
85 self
86 }
87
88 pub fn request_body(mut self, body: CreateMessageRequestBody) -> Self {
93 match serde_json::to_vec(&body) {
94 Ok(bytes) => {
95 self.request.api_req.body = bytes;
96 }
97 Err(e) => {
98 error!("Failed to serialize request body: {}", e);
99 self.request.api_req.body = Vec::new();
102 }
103 }
104 self
105 }
106
107 pub fn build(self) -> CreateMessageRequest {
109 self.request
110 }
111}
112
113crate::impl_executable_builder_owned!(
115 CreateMessageRequestBuilder,
116 MessageService,
117 CreateMessageRequest,
118 Message,
119 create
120);
121
122#[derive(Debug, Default, Clone, Serialize, Deserialize)]
124pub struct CreateMessageRequestBody {
125 pub receive_id: String,
130 pub msg_type: String,
135 pub content: String,
144 pub uuid: Option<String>,
153}
154
155impl CreateMessageRequestBody {
156 pub fn builder() -> CreateMessageRequestBodyBuilder {
157 CreateMessageRequestBodyBuilder::default()
158 }
159}
160
161#[derive(Default)]
162pub struct CreateMessageRequestBodyBuilder {
163 request: CreateMessageRequestBody,
164}
165
166impl CreateMessageRequestBodyBuilder {
167 pub fn receive_id(mut self, receive_id: impl ToString) -> Self {
172 self.request.receive_id = receive_id.to_string();
173 self
174 }
175
176 pub fn msg_type(mut self, msg_type: impl ToString) -> Self {
181 self.request.msg_type = msg_type.to_string();
182 self
183 }
184
185 pub fn content(mut self, content: impl ToString) -> Self {
194 self.request.content = content.to_string();
195 self
196 }
197
198 pub fn uuid(mut self, uuid: impl ToString) -> Self {
207 let uuid_str = uuid.to_string();
208 let validated_uuid = validate_string_length(uuid_str, uuid_limits::MAX_LENGTH, "UUID");
210 self.request.uuid = Some(validated_uuid);
211 self
212 }
213
214 pub fn build(self) -> CreateMessageRequestBody {
215 validate_required(&self.request.receive_id, "receive_id");
217 validate_required(&self.request.msg_type, "msg_type");
218 validate_required(&self.request.content, "content");
219
220 match self.request.msg_type.as_str() {
222 "text" => {
223 validate_content_size(
224 &self.request.content,
225 message_limits::TEXT_MESSAGE_MAX_SIZE,
226 "Text message",
227 );
228 }
229 "post" | "interactive" => {
230 validate_content_size(
231 &self.request.content,
232 message_limits::RICH_MESSAGE_MAX_SIZE,
233 "Post/interactive message",
234 );
235 }
236 _ => {
237 }
239 }
240
241 self.request
242 }
243}
244
245#[derive(Debug, Clone, Default)]
247pub struct UpdateMessageRequest {
248 pub api_req: ApiRequest,
249}
250
251impl UpdateMessageRequest {
252 pub fn builder() -> UpdateMessageRequestBuilder {
253 UpdateMessageRequestBuilder::default()
254 }
255}
256
257#[derive(Default)]
258pub struct UpdateMessageRequestBuilder {
259 request: UpdateMessageRequest,
260}
261
262impl UpdateMessageRequestBuilder {
263 pub fn content(mut self, content: impl ToString) -> Self {
268 self.request
269 .api_req
270 .query_params
271 .insert("content", content.to_string());
272 self
273 }
274
275 pub fn build(self) -> UpdateMessageRequest {
276 self.request
277 }
278}
279
280impl CreateMessageRequest {
282 pub fn with_msg<T: SendMessageTrait>(receive_id: &str, msg: T, receive_id_type: &str) -> Self {
284 let mut api_req = ApiRequest::default();
285 api_req
286 .query_params
287 .insert("receive_id", receive_id.to_string());
288 api_req.query_params.insert("msg_type", msg.msg_type());
289 api_req.query_params.insert("content", msg.content());
290 api_req
291 .query_params
292 .insert("receive_id_type", receive_id_type.to_string());
293
294 Self { api_req }
295 }
296}