openrouter_rs/api/
errors.rs1use 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}