use sfr_types as st;
pub use st::FilesGetUploadUrlExternalResponse;
use crate::{Client, Request};
use reqwest::multipart::Form;
#[derive(Debug)]
pub struct FilesGetUploadUrlExternal(st::FilesGetUploadUrlExternalRequest);
const API_CODE: &str = "files.getUploadURLExternal";
impl FilesGetUploadUrlExternal {
async fn request_inner(
self,
client: &Client,
) -> Result<FilesGetUploadUrlExternalResponse, st::Error> {
#[allow(clippy::missing_docs_in_private_items)] const URL: &str = "https://slack.com/api/files.getUploadURLExternal";
let form = self.form().await;
tracing::debug!("form = {form:?}");
let response = client
.client()
.post(URL)
.bearer_auth(client.token())
.multipart(form)
.send()
.await
.map_err(|e| st::Error::failed_to_request_by_http(API_CODE, e))?;
tracing::debug!("response = {response:?}");
let body: serde_json::Value = response
.json()
.await
.map_err(|e| st::Error::failed_to_read_json(API_CODE, e))?;
tracing::debug!("body = {body:?}");
body.try_into()
}
async fn form(self) -> Form {
let mut form = Form::new();
form = form.text("filename", self.0.filename);
form = form.text("length", self.0.length.to_string());
if let Some(alt_txt) = &self.0.alt_txt {
form = form.text("alt_txt", alt_txt.clone());
}
if let Some(snippet_type) = &self.0.snippet_type {
form = form.text("snippet_type", snippet_type.clone());
}
form
}
}
impl From<st::FilesGetUploadUrlExternalRequest> for FilesGetUploadUrlExternal {
fn from(inner: st::FilesGetUploadUrlExternalRequest) -> Self {
Self(inner)
}
}
impl Request for FilesGetUploadUrlExternal {
type Response = FilesGetUploadUrlExternalResponse;
async fn request(self, client: &Client) -> Result<Self::Response, st::Error> {
self.request_inner(client).await
}
}