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