gproxy_protocol/transform/claude/model_list/gemini/
response.rs1use 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}