Skip to main content

gproxy_protocol/transform/claude/model_list/gemini/
response.rs

1use crate::claude::model_list::response::{
2    ClaudeModelListResponse, ResponseBody as ClaudeModelListResponseBody,
3};
4use crate::claude::types::ClaudeResponseHeaders;
5use crate::gemini::model_list::response::GeminiModelListResponse;
6use crate::transform::claude::model_list::gemini::utils::{
7    beta_error_response_from_gemini, beta_model_info_from_gemini_model,
8};
9use crate::transform::utils::TransformError;
10
11impl TryFrom<GeminiModelListResponse> for ClaudeModelListResponse {
12    type Error = TransformError;
13
14    fn try_from(value: GeminiModelListResponse) -> Result<Self, TransformError> {
15        Ok(match value {
16            GeminiModelListResponse::Success {
17                stats_code,
18                headers,
19                body,
20            } => {
21                let has_more = body.next_page_token.is_some();
22                let data = body
23                    .models
24                    .into_iter()
25                    .map(beta_model_info_from_gemini_model)
26                    .collect::<Vec<_>>();
27                let first_id = data
28                    .first()
29                    .map(|model| model.id.clone())
30                    .unwrap_or_default();
31                let last_id = data
32                    .last()
33                    .map(|model| model.id.clone())
34                    .unwrap_or_default();
35
36                ClaudeModelListResponse::Success {
37                    stats_code,
38                    headers: ClaudeResponseHeaders {
39                        extra: headers.extra,
40                    },
41                    body: ClaudeModelListResponseBody {
42                        data,
43                        first_id,
44                        has_more,
45                        last_id,
46                    },
47                }
48            }
49            GeminiModelListResponse::Error {
50                stats_code,
51                headers,
52                body,
53            } => ClaudeModelListResponse::Error {
54                stats_code,
55                headers: ClaudeResponseHeaders {
56                    extra: headers.extra,
57                },
58                body: beta_error_response_from_gemini(stats_code, body),
59            },
60        })
61    }
62}