openrouter_rs/
utils.rs

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}