use crate::error::HalError;
use crate::query::SearchQuery;
use crate::response::SearchResponse;
pub const DEFAULT_BASE_URL: &str = "https://api.archives-ouvertes.fr/search/";
#[derive(Clone, Debug)]
pub struct HalClient {
base_url: String,
http: reqwest::Client,
}
impl Default for HalClient {
fn default() -> Self {
Self::new()
}
}
impl HalClient {
pub fn new() -> Self {
HalClient {
base_url: DEFAULT_BASE_URL.to_owned(),
http: reqwest::Client::new(),
}
}
pub fn with_base_url(base_url: impl Into<String>) -> Self {
HalClient {
base_url: base_url.into(),
http: reqwest::Client::new(),
}
}
pub fn base_url(&self) -> &str {
&self.base_url
}
pub async fn basic_search(&self, query: &str) -> Result<SearchResponse, HalError> {
self.search(&SearchQuery::basic(query)).await
}
pub async fn search(&self, query: &SearchQuery) -> Result<SearchResponse, HalError> {
let response = self
.http
.get(&self.base_url)
.query(&query.to_params())
.send()
.await?;
let status = response.status();
let body = response.text().await?;
if !status.is_success() {
let mut body = body;
body.truncate(500);
return Err(HalError::Api {
status: status.as_u16(),
body,
});
}
Ok(serde_json::from_str(&body)?)
}
}