use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use crate::error::AiMuxError;
use crate::shared::{
AbortSignal, FileBytes, SharedProviderMetadata, SharedProviderOptions, SharedProviderReference,
Warning,
};
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum UploadFileData {
Data { data: FileBytes },
Text { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct UploadFileCallOptions {
pub data: UploadFileData,
pub media_type: String,
pub filename: Option<String>,
pub provider_options: Option<SharedProviderOptions>,
#[serde(skip)]
#[ts(skip)]
pub abort_signal: Option<AbortSignal>,
}
impl UploadFileCallOptions {
pub fn new(data: UploadFileData, media_type: impl Into<String>) -> Self {
Self {
data,
media_type: media_type.into(),
filename: None,
provider_options: None,
abort_signal: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct UploadFileResult {
pub provider_reference: SharedProviderReference,
pub media_type: Option<String>,
pub filename: Option<String>,
pub provider_metadata: Option<SharedProviderMetadata>,
pub warnings: Vec<Warning>,
}
#[async_trait]
pub trait Files: Send + Sync {
fn specification_version(&self) -> &'static str {
"v4"
}
fn provider(&self) -> &str;
async fn upload_file(
&self,
options: &UploadFileCallOptions,
) -> Result<UploadFileResult, AiMuxError>;
}