#[cfg(feature = "base64")]
use base64::Engine;
#[cfg(feature = "base64")]
use base64::engine::general_purpose::STANDARD;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "base64")]
use crate::Result;
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NewFile {
pub content: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
}
impl NewFile {
#[cfg(feature = "base64")]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self {
content: STANDARD.encode(bytes),
filename: None,
content_type: None,
}
}
pub fn with_filename(mut self, filename: impl Into<String>) -> Self {
self.filename = Some(filename.into());
self
}
pub fn with_content_type(mut self, content_type: impl Into<String>) -> Self {
self.content_type = Some(content_type.into());
self
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FileId {
pub id: Uuid,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct File {
pub id: Uuid,
pub content: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
}
#[cfg(feature = "base64")]
impl File {
pub fn decode_content(&self) -> Result<Vec<u8>> {
Ok(STANDARD.decode(&self.content)?)
}
}