use serde::Deserialize;
use std::io::Read;
use crate::client::{DownloadRequest, KintoneClient, UploadRequest};
use crate::error::ApiError;
pub fn upload(filename: impl Into<String>) -> UploadFileRequest {
let upload_request =
UploadRequest::new(http::Method::POST, "/v1/file.json", "file".to_owned(), filename.into());
UploadFileRequest {
upload_request,
content_type: None,
}
}
#[must_use]
pub struct UploadFileRequest {
upload_request: UploadRequest,
content_type: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UploadFileResponse {
pub file_key: String,
}
impl UploadFileRequest {
pub fn content_type(mut self, content_type: impl Into<String>) -> Self {
self.content_type = Some(content_type.into());
self
}
pub fn send(
self,
client: &KintoneClient,
content: impl Read + Send + Sync + 'static,
) -> Result<UploadFileResponse, ApiError> {
self.upload_request.send(client, self.content_type, content)
}
}
pub fn download(file_key: impl Into<String>) -> DownloadFileRequest {
let download_request =
DownloadRequest::new(http::Method::GET, "/v1/file.json").query("fileKey", file_key.into());
DownloadFileRequest { download_request }
}
#[must_use]
pub struct DownloadFileRequest {
download_request: DownloadRequest,
}
impl DownloadFileRequest {
pub fn send(self, client: &KintoneClient) -> Result<DownloadFileResponse, ApiError> {
let resp = self.download_request.send(client)?;
Ok(DownloadFileResponse {
mime_type: resp.mime_type,
content: resp.content,
})
}
}
pub struct DownloadFileResponse {
pub mime_type: Option<mime::Mime>,
pub content: Box<dyn Read + Send + Sync + 'static>,
}
impl std::fmt::Debug for DownloadFileResponse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("DownloadFileResponse")
.field("mime_type", &self.mime_type)
.finish()
}
}