Skip to main content

openrouter_rust/
providers.rs

1use crate::{
2    client::OpenRouterClient,
3    error::{OpenRouterError, Result},
4};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Provider {
9    pub name: String,
10    pub slug: String,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub privacy_policy_url: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub terms_of_service_url: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub status_page_url: Option<String>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct ProvidersResponse {
21    pub data: Vec<Provider>,
22}
23
24impl OpenRouterClient {
25    pub async fn list_providers(&self) -> Result<ProvidersResponse> {
26        let url = format!("{}/providers", self.base_url);
27        let headers = self.build_headers()?;
28
29        let response = self
30            .client
31            .get(&url)
32            .headers(headers)
33            .send()
34            .await
35            .map_err(OpenRouterError::HttpError)?;
36
37        let status = response.status();
38        
39        if !status.is_success() {
40            let error_text = response.text().await.unwrap_or_default();
41            return Err(OpenRouterError::ApiError {
42                code: status.as_u16(),
43                message: error_text,
44            });
45        }
46
47        let providers = response
48            .json::<ProvidersResponse>()
49            .await
50            .map_err(OpenRouterError::HttpError)?;
51
52        Ok(providers)
53    }
54}