Skip to main content

systemprompt_files/services/
providers.rs

1use 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}