gproxy_protocol/transform/gemini/model_list/claude/
response.rs1use crate::claude::model_list::response::ClaudeModelListResponse;
2use crate::gemini::model_list::response::{
3 GeminiModelListResponse, ResponseBody as GeminiModelListResponseBody,
4};
5use crate::gemini::types::GeminiResponseHeaders;
6use crate::transform::gemini::model_list::claude::utils::{
7 gemini_error_response_from_claude, gemini_model_info_from_claude_model,
8};
9use crate::transform::utils::TransformError;
10
11impl TryFrom<ClaudeModelListResponse> for GeminiModelListResponse {
12 type Error = TransformError;
13
14 fn try_from(value: ClaudeModelListResponse) -> Result<Self, TransformError> {
15 Ok(match value {
16 ClaudeModelListResponse::Success {
17 stats_code,
18 headers,
19 body,
20 } => {
21 let next_page_token = if body.has_more && !body.last_id.is_empty() {
22 Some(body.last_id.clone())
23 } else {
24 None
25 };
26
27 GeminiModelListResponse::Success {
28 stats_code,
29 headers: GeminiResponseHeaders {
30 extra: headers.extra,
31 },
32 body: GeminiModelListResponseBody {
33 models: body
34 .data
35 .into_iter()
36 .map(gemini_model_info_from_claude_model)
37 .collect::<Vec<_>>(),
38 next_page_token,
39 },
40 }
41 }
42 ClaudeModelListResponse::Error {
43 stats_code,
44 headers,
45 body,
46 } => GeminiModelListResponse::Error {
47 stats_code,
48 headers: GeminiResponseHeaders {
49 extra: headers.extra,
50 },
51 body: gemini_error_response_from_claude(stats_code, body),
52 },
53 })
54 }
55}