Skip to main content

ferrin_google/
error.rs

1//! Google error response schema.
2
3use ferrin_provider_util::http::JsonErrorResponseHandler;
4use ferrin_provider_util::http::json_error_response_handler;
5use ferrin_spec::JsonValue;
6use serde::Deserialize;
7
8/// Body of a Google error response: `{error: {code, message, status, details}}`.
9#[derive(Debug, Clone, Deserialize)]
10pub struct GoogleErrorData {
11    /// The error object.
12    pub error: GoogleErrorDetail,
13}
14
15/// The `error` object of a Google error response.
16#[derive(Debug, Clone, Deserialize)]
17pub struct GoogleErrorDetail {
18    /// HTTP status code echoed by the API.
19    #[serde(default)]
20    pub code: Option<i64>,
21    /// Human-readable message.
22    #[serde(default)]
23    pub message: Option<String>,
24    /// gRPC status name (`RESOURCE_EXHAUSTED`, `INVALID_ARGUMENT`, ...).
25    #[serde(default)]
26    pub status: Option<String>,
27    /// Structured details (`google.rpc.RetryInfo`, `google.rpc.QuotaFailure`, ...).
28    #[serde(default)]
29    pub details: Option<Vec<JsonValue>>,
30}
31
32/// Message shown for an error body.
33#[must_use]
34pub fn error_message(data: &GoogleErrorData) -> String {
35    data.error
36        .message
37        .clone()
38        .unwrap_or_else(|| "Google Generative AI request failed".to_owned())
39}
40
41/// Failure handler decoding [`GoogleErrorData`] bodies.
42#[must_use]
43pub fn failed_response_handler() -> JsonErrorResponseHandler<GoogleErrorData> {
44    json_error_response_handler::<GoogleErrorData>(error_message)
45}