use super::access_policy::AccessPolicy;
use super::Gyazo;
use reqwest::multipart;
use std::fs;
use std::path::Path;
#[derive(serde::Deserialize, Debug)]
pub struct UploadResponse {
pub created_at: String,
pub image_id: String,
pub permalink_url: String,
pub thumb_url: String,
pub r#type: String,
pub url: String,
}
#[derive(Default)]
pub struct GyazoUploadOptions {
pub access_policy: Option<AccessPolicy>,
pub metadata_is_public: Option<bool>,
pub referer_url: Option<String>,
pub app: Option<String>,
pub title: Option<String>,
pub desc: Option<String>,
pub created_at: Option<f64>,
pub collection_id: Option<String>,
}
impl Gyazo {
pub async fn upload<P: AsRef<Path>>(
&self,
image_path: P,
options: Option<&GyazoUploadOptions>,
) -> Result<UploadResponse, reqwest::Error> {
let file_content = fs::read(&image_path).expect("Failed to read the file");
let mut form = multipart::Form::new()
.text("access_token", self.access_token.clone())
.part(
"imagedata",
multipart::Part::bytes(file_content)
.file_name(image_path.as_ref().to_str().unwrap().to_string()),
);
if let Some(opts) = options {
if let Some(access_policy) = &opts.access_policy {
form = form.text("access_policy", access_policy.as_str().to_string());
}
if let Some(metadata_is_public) = &opts.metadata_is_public {
form = form.text("metadata_is_public", metadata_is_public.to_string());
}
if let Some(referer_url) = &opts.referer_url {
form = form.text("referer_url", referer_url.clone());
}
if let Some(app) = &opts.app {
form = form.text("app", app.clone());
}
if let Some(title) = &opts.title {
form = form.text("title", title.clone());
}
if let Some(desc) = &opts.desc {
form = form.text("desc", desc.clone());
}
if let Some(created_at) = opts.created_at {
form = form.text("created_at", created_at.to_string());
}
if let Some(collection_id) = &opts.collection_id {
form = form.text("collection_id", collection_id.clone());
}
}
let response = self
.client
.post("https://upload.gyazo.com/api/upload")
.multipart(form)
.send()
.await?
.error_for_status()?
.json::<UploadResponse>()
.await?;
Ok(response)
}
}