use crate::api::client::UploadClient;
use crate::models::*;
use crate::types::Result;
use std::fmt::Debug;
use std::path::Path;
use hyper::Request;
use hyper_multipart::client::multipart::Form;
use hyper_multipart_rfc7578 as hyper_multipart;
use hyper_multipart_rfc7578::client::multipart::Body;
pub struct FileUploader<'a, P> {
client: UploadClient<Body>,
req: UploadFileRequest<'a, P>,
}
impl<'a, P> FileUploader<'a, P>
where
P: AsRef<Path> + Debug,
{
pub fn new(file_path: P) -> Result<Self> {
Ok(Self {
client: UploadClient::from_env()?,
req: UploadFileRequest::new(file_path),
})
}
pub fn with_token(file_path: P, access_token: &'static str) -> Self {
Self {
client: UploadClient::from_token(access_token),
req: UploadFileRequest::new(file_path),
}
}
pub fn with_client(file_path: P, client: UploadClient<Body>) -> Self {
Self {
client,
req: UploadFileRequest::new(file_path),
}
}
pub fn project_id(mut self, project_id: &'a str) -> FileUploader<'a, P> {
self.req.project_id = Some(project_id);
self
}
pub fn name(mut self, name: &'a str) -> FileUploader<'a, P> {
self.req.name = Some(name);
self
}
pub fn description(mut self, description: &'a str) -> FileUploader<'a, P> {
self.req.description = Some(description);
self
}
pub fn contact_id(mut self, contact_id: &'a str) -> FileUploader<'a, P> {
self.req.contact_id = Some(contact_id);
self
}
pub async fn send(&self) -> Result<UploadResponse> {
let params = UploadRequest {
access_token: self.client.access_token.as_str(),
url: None,
project_id: self.req.project_id,
name: self.req.name,
description: None,
contact_id: self.req.contact_id,
};
let url = UploadClient::<Body>::build_url(params)?;
let req_builder = Request::post(&url);
let mut form = Form::default();
form.add_file("file", &self.req.file_path)
.unwrap_or_else(|_| panic!("source file path ({:?}) should exist", self.req.file_path));
if let Some(description) = self.req.description {
form.add_text("description", description);
}
let form = form.set_body::<Body>(req_builder).unwrap();
self.client.make_request(&url, form).await
}
}