Skip to main content

gemini_client_api/gemini/
error.rs

1use reqwest::StatusCode;
2use serde::{Deserialize, Deserializer};
3use serde_json::Value;
4
5fn deserialize_status_code<'de, D>(deserializer: D) -> Result<StatusCode, D::Error>
6where
7    D: Deserializer<'de>,
8{
9    let s = u16::deserialize(deserializer)?;
10    StatusCode::from_u16(s).map_err(serde::de::Error::custom)
11}
12#[derive(Deserialize, thiserror::Error, Debug)]
13#[error("{code}, status {status} : {message}")]
14pub struct Error {
15    #[serde(deserialize_with = "deserialize_status_code")]
16    pub code: StatusCode,
17    pub message: String,
18    pub status: String,
19    pub details: Option<Vec<Value>>,
20}
21
22#[derive(Deserialize, thiserror::Error, Debug)]
23#[error("Gemini API Error: {error}")]
24pub struct GeminiError {
25    pub error: Error,
26}
27#[derive(thiserror::Error, Debug)]
28pub enum GeminiResponseError {
29    #[error(transparent)]
30    #[cfg(feature = "reqwest")]
31    ReqwestError(reqwest::Error),
32    #[error("Response status not Ok. Response string: {0}")]
33    ///Response status not Ok. Contains Response string
34    StatusNotOk(GeminiError),
35    #[error("Cannot Respond if last Chat has Role::Model")]
36    ///Cannot Responnd if last Chat has Role::Model
37    NothingToRespond,
38}
39
40#[derive(thiserror::Error, Debug)]
41pub enum GeminiResponseStreamError {
42    #[error(transparent)]
43    #[cfg(feature = "reqwest")]
44    ReqwestError(reqwest::Error),
45    #[error("Invalid Response Format received. Response: {0}")]
46    ///Invalid Response Format received. Contains response string
47    InvalidResposeFormat(String),
48}