use super::media::MediaData;
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageData {
pub base64_data: String,
pub mime_type: String,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub is_url: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<String>,
}
impl MediaData for ImageData {
fn base64_data(&self) -> &str {
&self.base64_data
}
fn mime_type(&self) -> String {
self.mime_type.clone()
}
fn is_url(&self) -> bool {
self.is_url
}
fn from_base64(base64_data: impl Into<String>, mime_type: impl Into<String>) -> Self {
Self {
base64_data: base64_data.into(),
mime_type: mime_type.into(),
is_url: false,
detail: None,
}
}
fn guess_format(path: &Path) -> Option<String> {
let mime = match path.extension().and_then(|e| e.to_str()) {
Some("png") => "image/png",
Some("jpg") | Some("jpeg") => "image/jpeg",
Some("gif") => "image/gif",
Some("webp") => "image/webp",
Some("bmp") => "image/bmp",
Some("svg") => "image/svg+xml",
_ => "application/octet-stream",
};
Some(mime.to_string())
}
}
crate::impl_media_forwarders!(ImageData, mime_type);
impl ImageData {
pub fn from_url(url: impl Into<String>) -> Self {
Self {
base64_data: url.into(),
mime_type: String::new(),
is_url: true,
detail: None,
}
}
pub fn with_detail(mut self, detail: impl Into<String>) -> Self {
self.detail = Some(detail.into());
self
}
}