gemini_client_api/gemini/
utils.rs

1use super::types::request::*;
2use crate::utils;
3
4///Converts markdown to parts considering `![image](line)` means Gemini will be see the images too
5pub struct MarkdownToParts<'a> {
6    base64s: Vec<(Option<String>, Option<String>)>,
7    markdown: &'a str,
8}
9impl<'a> MarkdownToParts<'a> {
10    pub async fn new(markdown: &'a str) -> Self {
11        Self {
12            base64s: utils::get_image_base64s(markdown).await,
13            markdown,
14        }
15    }
16    pub fn process(self, default_mime_type: String) -> Vec<Part> {
17        let image_detect = utils::get_image_regex();
18        let mut parts: Vec<Part> = Vec::new();
19        let mut i = 0;
20        let mut markdown = self.markdown;
21        while let Some(image) = image_detect.find(&markdown) {
22            let start = image.start();
23            let image_markdown = image.as_str();
24            let text = &markdown[..start + image_markdown.len()];
25
26            parts.push(Part::text(text.to_string()));
27            if let (mime, Some(base64)) = &self.base64s[i] {
28                parts.push(Part::inline_data(InlineData::new(
29                    mime.as_ref().unwrap_or(&default_mime_type).to_string(),
30                    base64.to_string(),
31                )));
32            }
33
34            markdown = &markdown[start + image_markdown.len()..];
35            i += 1;
36        }
37        if markdown.len() != 0 {
38            parts.push(Part::text(markdown.to_string()));
39        }
40        parts
41    }
42}