1use crate::{api::errors::ApiErrorResponse, error::OpenRouterError};
2use surf::Response;
3
4#[macro_export]
5macro_rules! strip_option_vec_setter {
6 ($field:ident, $item_ty:ty) => {
7 pub fn $field<T, S>(&mut self, items: T) -> &mut Self
8 where
9 T: IntoIterator<Item = S>,
10 S: Into<$item_ty>,
11 {
12 self.$field = Some(Some(items.into_iter().map(Into::into).collect()));
13 self
14 }
15 };
16}
17
18#[macro_export]
19macro_rules! strip_option_map_setter {
20 ($field:ident, $key_ty:ty, $val_ty:ty) => {
21 pub fn $field<K, V, T>(&mut self, items: T) -> &mut Self
22 where
23 T: IntoIterator<Item = (K, V)>,
24 K: Into<$key_ty>,
25 V: Into<$val_ty>,
26 {
27 let map: std::collections::HashMap<$key_ty, $val_ty> = items
28 .into_iter()
29 .map(|(k, v)| (k.into(), v.into()))
30 .collect();
31
32 self.$field = Some(Some(map));
33 self
34 }
35 };
36}
37
38pub async fn handle_error(mut response: Response) -> Result<(), OpenRouterError> {
39 let status = response.status();
40 let text = response
41 .body_string()
42 .await
43 .unwrap_or_else(|_| "Failed to read response text".to_string());
44 let api_error_response: Result<ApiErrorResponse, _> = serde_json::from_str(&text);
45
46 if let Ok(api_error_response) = api_error_response {
47 Err(OpenRouterError::from(api_error_response))
48 } else {
49 Err(OpenRouterError::ApiError {
50 code: status,
51 message: text,
52 })
53 }
54}