gemini_rust/file_search/
document_handle.rs

1use std::sync::Arc;
2use tracing::instrument;
3
4use crate::client::{Error, GeminiClient};
5use crate::file_search::model::{extract_document_id, extract_store_name, Document, DocumentState};
6
7/// A handle for managing a document within a file search store.
8///
9/// Provides methods to check document state, refresh metadata, and delete documents.
10#[derive(Debug, Clone)]
11pub struct DocumentHandle {
12    client: Arc<GeminiClient>,
13    document: Document,
14}
15
16impl DocumentHandle {
17    pub fn new(client: Arc<GeminiClient>, document: Document) -> Self {
18        Self { client, document }
19    }
20
21    pub fn name(&self) -> &str {
22        &self.document.name
23    }
24
25    pub fn state(&self) -> DocumentState {
26        self.document.state
27    }
28
29    pub fn is_active(&self) -> bool {
30        self.document.state == DocumentState::StateActive
31    }
32
33    pub fn document(&self) -> &Document {
34        &self.document
35    }
36
37    #[instrument(skip_all, fields(document.name = %self.document.name))]
38    pub async fn refresh(&mut self) -> Result<(), Error> {
39        let store_name = extract_store_name(&self.document.name)?;
40        let doc_id = extract_document_id(&self.document.name)?;
41        self.document = self.client.get_document(&store_name, &doc_id).await?;
42        Ok(())
43    }
44
45    #[instrument(skip_all, fields(document.name = %self.document.name, force))]
46    pub async fn delete(self, force: bool) -> Result<(), Error> {
47        let store_name = extract_store_name(&self.document.name)?;
48        let doc_id = extract_document_id(&self.document.name)?;
49        self.client
50            .delete_document(&store_name, &doc_id, force)
51            .await
52    }
53}