llm_api_access/gemini/
response.rs1use 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 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}