gemini_client_api/gemini/
utils.rs1use super::types::request::*;
2use crate::utils;
3
4pub 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}