use crate::client::{Idempotency, Skailar};
use crate::error::Error;
use crate::types::uploads::{FileContentType, ImageContentType, UploadRequest, UploadResponse};
#[derive(Debug, Clone, Copy)]
pub struct Uploads<'a> {
client: &'a Skailar,
}
impl<'a> Uploads<'a> {
pub(crate) fn new(client: &'a Skailar) -> Self {
Uploads { client }
}
pub fn images(&self) -> ImageUploads<'a> {
ImageUploads {
client: self.client,
}
}
pub fn files(&self) -> FileUploads<'a> {
FileUploads {
client: self.client,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ImageUploads<'a> {
client: &'a Skailar,
}
impl ImageUploads<'_> {
pub async fn create(
&self,
base64: impl Into<String>,
content_type: ImageContentType,
) -> Result<UploadResponse, Error> {
let content_type = serde_content_type(&content_type);
let request = UploadRequest {
base64: base64.into(),
content_type,
};
self.client
.post_json("v1/uploads/images", &request, Idempotency::SideEffect)
.await
}
}
#[derive(Debug, Clone, Copy)]
pub struct FileUploads<'a> {
client: &'a Skailar,
}
impl FileUploads<'_> {
pub async fn create(
&self,
base64: impl Into<String>,
content_type: FileContentType,
) -> Result<UploadResponse, Error> {
let content_type = serde_content_type(&content_type);
let request = UploadRequest {
base64: base64.into(),
content_type,
};
self.client
.post_json("v1/uploads/files", &request, Idempotency::SideEffect)
.await
}
}
fn serde_content_type<T: serde::Serialize>(value: &T) -> String {
match serde_json::to_value(value) {
Ok(serde_json::Value::String(s)) => s,
_ => String::new(),
}
}