gemini_rust/files/
builder.rs

1use mime::Mime;
2use snafu::ResultExt;
3use std::sync::Arc;
4use tracing::instrument;
5
6use super::*;
7use crate::client::GeminiClient;
8
9/// A builder for creating a file resource.
10pub struct FileBuilder {
11    client: Arc<GeminiClient>,
12    file_bytes: Vec<u8>,
13    display_name: Option<String>,
14    mime_type: Option<Mime>,
15}
16
17impl FileBuilder {
18    pub(crate) fn new<B: Into<Vec<u8>>>(client: Arc<GeminiClient>, file_bytes: B) -> Self {
19        Self {
20            client,
21            file_bytes: file_bytes.into(),
22            display_name: None,
23            mime_type: None,
24        }
25    }
26
27    /// The display name of the file.
28    pub fn display_name(mut self, display_name: impl Into<String>) -> Self {
29        self.display_name = Some(display_name.into());
30        self
31    }
32
33    /// The MIME type of the file.
34    pub fn with_mime_type(mut self, mime_type: Mime) -> Self {
35        self.mime_type = Some(mime_type);
36        self
37    }
38
39    /// Upload the file.
40    #[instrument(skip_all, fields(
41        file.size = self.file_bytes.len(),
42        mime.type = self.mime_type.as_ref().map(|m| m.to_string()),
43        file.display_name = self.display_name,
44    ))]
45    pub async fn upload(self) -> Result<super::handle::FileHandle, super::Error> {
46        let mime_type = self.mime_type.unwrap_or(mime::APPLICATION_OCTET_STREAM);
47
48        let file = self
49            .client
50            .upload_file(self.display_name, self.file_bytes, mime_type)
51            .await
52            .context(ClientSnafu)?;
53
54        Ok(super::handle::FileHandle::new(self.client, file))
55    }
56}