openrouter_rs/api/
errors.rs

1use serde::{Deserialize, Serialize};
2use surf::StatusCode;
3
4#[derive(Serialize, Deserialize, Debug)]
5pub struct ApiErrorResponse {
6    error: ApiError,
7}
8
9#[derive(Serialize, Deserialize, Debug)]
10pub struct ApiError {
11    code: StatusCode,
12    message: String,
13    metadata: Option<ApiErrorMetadata>,
14}
15
16#[derive(Serialize, Deserialize, Debug)]
17#[serde(untagged)]
18pub enum ApiErrorMetadata {
19    ModerationError(ModerationErrorMetadata),
20    ProviderError(ProviderErrorMetadata),
21    Raw(serde_json::Value),
22}
23
24#[derive(Serialize, Deserialize, Debug)]
25pub struct ModerationErrorMetadata {
26    reasons: Vec<String>,
27    flagged_input: String,
28    provider_name: String,
29    model_slug: String,
30}
31
32#[derive(Serialize, Deserialize, Debug)]
33pub struct ProviderErrorMetadata {
34    provider_name: String,
35    raw: serde_json::Value,
36}
37
38impl From<ApiErrorResponse> for crate::error::OpenRouterError {
39    fn from(api_error_response: ApiErrorResponse) -> Self {
40        let ApiError {
41            code,
42            message,
43            metadata,
44        } = api_error_response.error;
45
46        match metadata {
47            Some(ApiErrorMetadata::ModerationError(moderation_error)) => {
48                crate::error::OpenRouterError::ModerationError {
49                    code,
50                    message,
51                    reasons: moderation_error.reasons,
52                    flagged_input: moderation_error.flagged_input,
53                    provider_name: moderation_error.provider_name,
54                    model_slug: moderation_error.model_slug,
55                }
56            }
57            Some(ApiErrorMetadata::ProviderError(provider_error)) => {
58                crate::error::OpenRouterError::ProviderError {
59                    code,
60                    message,
61                    provider_name: provider_error.provider_name,
62                    raw: provider_error.raw,
63                }
64            }
65            Some(ApiErrorMetadata::Raw(raw_metadata)) => {
66                crate::error::OpenRouterError::ApiErrorWithMetadata {
67                    code,
68                    message,
69                    metadata: raw_metadata,
70                }
71            }
72            None => crate::error::OpenRouterError::ApiError { code, message },
73        }
74    }
75}