use std::borrow::Cow;
use reqwest::multipart::{Form, Part};
use crate::builder::CreateAttachment;
use crate::internal::prelude::*;
impl CreateAttachment {
fn into_part(self) -> Result<Part> {
let mut part = Part::bytes(self.data);
part = guess_mime_str(part, &self.filename)?;
part = part.file_name(self.filename);
Ok(part)
}
}
#[derive(Clone, Debug)]
pub enum MultipartUpload {
File(CreateAttachment),
Attachments(Vec<CreateAttachment>),
}
#[derive(Clone, Debug)]
pub struct Multipart {
pub upload: MultipartUpload,
pub fields: Vec<(Cow<'static, str>, Cow<'static, str>)>,
pub payload_json: Option<String>,
}
impl Multipart {
pub(crate) fn build_form(self) -> Result<Form> {
let mut multipart = Form::new();
match self.upload {
MultipartUpload::File(upload_file) => {
multipart = multipart.part("file", upload_file.into_part()?);
},
MultipartUpload::Attachments(attachment_files) => {
for file in attachment_files {
multipart = multipart.part(format!("files[{}]", file.id), file.into_part()?);
}
},
}
for (name, value) in self.fields {
multipart = multipart.text(name, value);
}
if let Some(payload_json) = self.payload_json {
multipart = multipart.text("payload_json", payload_json);
}
Ok(multipart)
}
}
fn guess_mime_str(part: Part, filename: &str) -> Result<Part> {
let mime_type = mime_guess::from_path(filename).first_or_octet_stream();
part.mime_str(mime_type.essence_str()).map_err(Into::into)
}