gemini_rust/file_search/
document_handle.rs1use 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#[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}