gemini_rust/file_search/
import_builder.rs

1use std::sync::Arc;
2use tracing::instrument;
3
4use crate::client::{Error, GeminiClient};
5use crate::file_search::model::{ChunkingConfig, CustomMetadata, ImportFileRequest};
6use crate::file_search::OperationHandle;
7
8pub struct ImportBuilder {
9    pub(crate) client: Arc<GeminiClient>,
10    pub(crate) store_name: String,
11    pub(crate) file_name: String,
12    pub(crate) custom_metadata: Option<Vec<CustomMetadata>>,
13    pub(crate) chunking_config: Option<ChunkingConfig>,
14}
15
16impl ImportBuilder {
17    pub fn with_custom_metadata(mut self, metadata: Vec<CustomMetadata>) -> Self {
18        self.custom_metadata = Some(metadata);
19        self
20    }
21
22    pub fn with_chunking_config(mut self, config: ChunkingConfig) -> Self {
23        self.chunking_config = Some(config);
24        self
25    }
26
27    #[instrument(skip_all, fields(
28        store.name = %self.store_name,
29        file.name = %self.file_name,
30        metadata.present = self.custom_metadata.is_some(),
31        chunking.present = self.chunking_config.is_some(),
32    ))]
33    pub async fn execute(self) -> Result<OperationHandle, Error> {
34        let request = ImportFileRequest {
35            file_name: self.file_name,
36            custom_metadata: self.custom_metadata,
37            chunking_config: self.chunking_config,
38        };
39
40        let operation = self
41            .client
42            .import_file_to_search_store(&self.store_name, request)
43            .await?;
44
45        Ok(OperationHandle::new(self.client, operation))
46    }
47}