systemprompt_files/services/
providers.rs1use async_trait::async_trait;
2use systemprompt_identifiers::ContextId;
3use systemprompt_traits::{
4 FileUploadInput, FileUploadProvider, FileUploadProviderError, FileUploadResult,
5 UploadedFileInfo,
6};
7
8use super::upload::{FileUploadRequest, FileUploadService};
9
10#[async_trait]
11impl FileUploadProvider for FileUploadService {
12 fn is_enabled(&self) -> bool {
13 Self::is_enabled(self)
14 }
15
16 async fn upload_file(&self, input: FileUploadInput) -> FileUploadResult<UploadedFileInfo> {
17 let context_id = input.context_id.unwrap_or_else(ContextId::generate);
18 let mut builder =
19 FileUploadRequest::builder(&input.mime_type, &input.bytes_base64, context_id);
20
21 if let Some(name) = input.name {
22 builder = builder.with_name(&name);
23 }
24
25 if let Some(user_id) = input.user_id {
26 builder = builder.with_user_id(user_id);
27 }
28
29 if let Some(session_id) = input.session_id {
30 builder = builder.with_session_id(session_id);
31 }
32
33 if let Some(trace_id) = input.trace_id {
34 builder = builder.with_trace_id(trace_id);
35 }
36
37 let request = builder.build();
38
39 let uploaded = Self::upload_file(self, request)
40 .await
41 .map_err(|e| FileUploadProviderError::StorageError(e.to_string()))?;
42
43 Ok(UploadedFileInfo {
44 file_id: uploaded.file_id,
45 public_url: uploaded.public_url,
46 size_bytes: Some(uploaded.size_bytes),
47 })
48 }
49}