use crate::api::client::UploadClient;
use crate::constants::UPLOAD_API;
use crate::models::*;
use crate::types::Result;
use hyper::header::CONTENT_TYPE;
use hyper::{Body, Request};
use serde_urlencoded::to_string;
#[derive(Clone)]
pub struct UrlUploader<'a, B = Body> {
client: UploadClient<B>,
req: UploadUrlRequest<'a>,
}
impl<'a> From<String> for UrlUploader<'a> {
fn from(token: String) -> Self {
Self {
client: UploadClient::from(token),
req: UploadUrlRequest::default(),
}
}
}
impl<'a> From<&str> for UrlUploader<'a> {
fn from(token: &str) -> Self {
Self {
client: UploadClient::from(token),
req: UploadUrlRequest::default(),
}
}
}
impl<'a> UrlUploader<'a> {
pub fn new(url: &'a str) -> Result<Self> {
Ok(Self {
client: UploadClient::from_env()?,
req: UploadUrlRequest {
url,
..Default::default()
},
})
}
pub fn with_token(url: &'a str, access_token: &str) -> Self {
Self {
client: UploadClient::from(access_token),
req: UploadUrlRequest {
url,
..Default::default()
},
}
}
pub fn with_client(url: &'a str, client: UploadClient<Body>) -> Self {
Self {
client,
req: UploadUrlRequest {
url,
..Default::default()
},
}
}
pub fn url(mut self, url: &'a str) -> Self {
self.req.url = url;
self
}
pub fn project_id(mut self, project_id: &'a str) -> Self {
self.req.project_id = Some(project_id);
self
}
pub fn name(mut self, name: &'a str) -> Self {
self.req.name = Some(name);
self
}
pub fn description(mut self, description: &'a str) -> Self {
self.req.description = Some(description);
self
}
pub fn contact_id(mut self, contact_id: &'a str) -> Self {
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: Some(self.req.url),
project_id: self.req.project_id,
name: self.req.name,
description: self.req.description,
contact_id: self.req.contact_id,
};
let url_encoded_data = to_string(params)?;
let req = Request::post(UPLOAD_API)
.header(CONTENT_TYPE, "application/x-www-form-urlencoded")
.body(Body::from(url_encoded_data))?;
self.client.make_request(UPLOAD_API, req).await
}
}