llm_api_access/gemini/
response.rs

1// src/gemini/response.rs
2use crate::errors::GeneralError;
3use serde::de::DeserializeOwned;
4use crate::gemini::types::{GeminiResponse, GeminiErrorResponse};
5
6pub async fn parse_gemini_response<T: DeserializeOwned>(
7    response: reqwest::Response,
8) -> Result<T, Box<dyn std::error::Error + Send + Sync>> {
9    let response_body = response.text().await.map_err(|e| {
10        Box::new(GeneralError {
11            message: format!("Failed to read response from Gemini API: {}", e.to_string()),
12        }) as Box<dyn std::error::Error + Send + Sync>
13    })?;
14
15    serde_json::from_str(&response_body).map_err(|e| {
16        Box::new(GeneralError {
17            message: format!("Failed to parse response from Gemini API 1: {}", e.to_string()),
18        }) as Box<dyn std::error::Error + Send + Sync>
19    })
20}
21
22pub fn handle_gemini_error(response_body: &str) -> Result<String, Box<dyn std::error::Error + Send + Sync>> {
23    let gemini_response: Result<GeminiResponse, _> = serde_json::from_str(&response_body);
24
25    match gemini_response {
26        Ok(response) => Ok(response.candidates[0].content.parts[0].text.clone()),
27        Err(_) => {
28            // Try to parse the response as a GeminiErrorResponse
29            let error_response: Result<GeminiErrorResponse, _> =
30                serde_json::from_str(&response_body).map_err(|e| {
31                    Box::new(GeneralError {
32                        message: format!(
33                            "Failed to parse error response from Gemini API 2: {}",
34                            e.to_string()
35                        ),
36                    }) as Box<dyn std::error::Error + Send + Sync>
37                });
38
39            match error_response {
40                Ok(err) => Err(Box::new(GeneralError {
41                    message: format!("Gemini API Error: {}", err.error.message),
42                }) as Box<dyn std::error::Error + Send + Sync>),
43                Err(e) => Err(e),
44            }
45        }
46    }
47}