openrouter_rust/
providers.rs1use 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}