mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-23 15:01:45 +01:00
Add InputFile::Memory
This commit is contained in:
parent
2021be11b7
commit
9bfec9546f
3 changed files with 39 additions and 1 deletions
|
@ -3,7 +3,7 @@ use std::{borrow::Cow, path::PathBuf};
|
|||
use reqwest::multipart::Form;
|
||||
|
||||
use crate::{
|
||||
requests::utils::file_to_part,
|
||||
requests::utils::{file_from_memory_to_part, file_to_part},
|
||||
types::{
|
||||
ChatId, InlineKeyboardMarkup, InputFile, InputMedia, MaskPosition,
|
||||
ParseMode, ReplyMarkup,
|
||||
|
@ -33,6 +33,9 @@ impl FormBuilder {
|
|||
Self { form: self.form.text(name, string) }
|
||||
}
|
||||
Some(FormValue::File(path)) => self.add_file(name, path).await,
|
||||
Some(FormValue::Memory(data)) => {
|
||||
self.add_file_from_memory(name, data)
|
||||
}
|
||||
None => self,
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +53,19 @@ impl FormBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
fn add_file_from_memory<'a, N>(self, name: N, data: Vec<u8>) -> Self
|
||||
where
|
||||
N: Into<Cow<'a, str>>,
|
||||
{
|
||||
let name = name.into().into_owned();
|
||||
|
||||
Self {
|
||||
form: self
|
||||
.form
|
||||
.part(name.clone(), file_from_memory_to_part(data, name)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build(self) -> Form {
|
||||
self.form
|
||||
}
|
||||
|
@ -57,6 +73,7 @@ impl FormBuilder {
|
|||
|
||||
pub(crate) enum FormValue {
|
||||
File(PathBuf),
|
||||
Memory(Vec<u8>),
|
||||
Str(String),
|
||||
}
|
||||
|
||||
|
@ -153,6 +170,7 @@ impl IntoFormValue for InputFile {
|
|||
fn into_form_value(&self) -> Option<FormValue> {
|
||||
match self {
|
||||
InputFile::File(path) => Some(FormValue::File(path.clone())),
|
||||
InputFile::Memory(data) => Some(FormValue::Memory(data.clone())),
|
||||
InputFile::Url(url) => Some(FormValue::Str(url.clone())),
|
||||
InputFile::FileId(file_id) => Some(FormValue::Str(file_id.clone())),
|
||||
}
|
||||
|
|
|
@ -34,3 +34,7 @@ pub async fn file_to_part(path_to_file: PathBuf) -> Part {
|
|||
|
||||
Part::stream(Body::wrap_stream(file)).file_name(file_name)
|
||||
}
|
||||
|
||||
pub fn file_from_memory_to_part(data: Vec<u8>, name: String) -> Part {
|
||||
Part::bytes(data).file_name(name)
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ use std::path::PathBuf;
|
|||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize)]
|
||||
pub enum InputFile {
|
||||
File(PathBuf),
|
||||
Memory(Vec<u8>),
|
||||
Url(String),
|
||||
FileId(String),
|
||||
}
|
||||
|
@ -20,6 +21,13 @@ impl InputFile {
|
|||
Self::File(path.into())
|
||||
}
|
||||
|
||||
pub fn memory<D>(data: D) -> Self
|
||||
where
|
||||
D: Into<Vec<u8>>,
|
||||
{
|
||||
Self::Memory(data.into())
|
||||
}
|
||||
|
||||
pub fn url<T>(url: T) -> Self
|
||||
where
|
||||
T: Into<String>,
|
||||
|
@ -82,6 +90,14 @@ impl Serialize for InputFile {
|
|||
),
|
||||
)
|
||||
}
|
||||
InputFile::Memory(data) => {
|
||||
// NOTE: file should be actually attached with
|
||||
// multipart/form-data
|
||||
serializer.serialize_str(&format!(
|
||||
"attach://{}",
|
||||
String::from_utf8_lossy(data)
|
||||
))
|
||||
}
|
||||
InputFile::Url(url) => serializer.serialize_str(url),
|
||||
InputFile::FileId(id) => serializer.serialize_str(id),
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue