use crate::{
client::OpenRouterClient,
error::{OpenRouterError, Result},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Provider {
pub name: String,
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub privacy_policy_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub terms_of_service_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_page_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProvidersResponse {
pub data: Vec<Provider>,
}
impl OpenRouterClient {
pub async fn list_providers(&self) -> Result<ProvidersResponse> {
let url = format!("{}/providers", self.base_url);
let headers = self.build_headers()?;
let response = self
.client
.get(&url)
.headers(headers)
.send()
.await
.map_err(OpenRouterError::HttpError)?;
let status = response.status();
if !status.is_success() {
let error_text = response.text().await.unwrap_or_default();
return Err(OpenRouterError::ApiError {
code: status.as_u16(),
message: error_text,
});
}
let providers = response
.json::<ProvidersResponse>()
.await
.map_err(OpenRouterError::HttpError)?;
Ok(providers)
}
}