teloxide_core/requests/
multipart_payload.rs

1use crate::{
2    payloads,
3    requests::Payload,
4    types::{InputFile, InputFileLike, InputMedia, InputPaidMedia, InputSticker},
5};
6
7/// Payloads that need to be sent as `multipart/form-data` because they contain
8/// files inside.
9pub trait MultipartPayload: Payload {
10    fn copy_files(&self, into: &mut dyn FnMut(InputFile));
11
12    fn move_files(&mut self, into: &mut dyn FnMut(InputFile));
13}
14
15impl MultipartPayload for payloads::SendPaidMedia {
16    fn copy_files(&self, into: &mut dyn FnMut(InputFile)) {
17        self.media.iter().flat_map(InputPaidMedia::files).for_each(|f| f.copy_into(into))
18    }
19
20    fn move_files(&mut self, into: &mut dyn FnMut(InputFile)) {
21        self.media.iter_mut().flat_map(InputPaidMedia::files_mut).for_each(|f| f.move_into(into))
22    }
23}
24
25impl MultipartPayload for payloads::SendMediaGroup {
26    fn copy_files(&self, into: &mut dyn FnMut(InputFile)) {
27        self.media.iter().flat_map(InputMedia::files).for_each(|f| f.copy_into(into))
28    }
29
30    fn move_files(&mut self, into: &mut dyn FnMut(InputFile)) {
31        self.media.iter_mut().flat_map(InputMedia::files_mut).for_each(|f| f.move_into(into))
32    }
33}
34
35impl MultipartPayload for payloads::EditMessageMedia {
36    fn copy_files(&self, into: &mut dyn FnMut(InputFile)) {
37        self.media.files().for_each(|f| f.copy_into(into))
38    }
39
40    fn move_files(&mut self, into: &mut dyn FnMut(InputFile)) {
41        self.media.files_mut().for_each(|f| f.move_into(into))
42    }
43}
44
45impl MultipartPayload for payloads::EditMessageMediaInline {
46    fn copy_files(&self, into: &mut dyn FnMut(InputFile)) {
47        self.media.files().for_each(|f| f.copy_into(into))
48    }
49
50    fn move_files(&mut self, into: &mut dyn FnMut(InputFile)) {
51        self.media.files_mut().for_each(|f| f.move_into(into))
52    }
53}
54
55impl MultipartPayload for payloads::CreateNewStickerSet {
56    fn copy_files(&self, into: &mut dyn FnMut(InputFile)) {
57        self.stickers
58            .iter()
59            .for_each(|InputSticker { sticker: f, .. }: &InputSticker| f.copy_into(into))
60    }
61
62    fn move_files(&mut self, into: &mut dyn FnMut(InputFile)) {
63        self.stickers
64            .iter_mut()
65            .for_each(|InputSticker { sticker: f, .. }: &mut InputSticker| f.move_into(into))
66    }
67}