use std::collections::HashMap;
use std::time::Duration;
use crate::error::Result;
use crate::filter::ProjectFilter;
use crate::models::{Package, Problem};
pub struct RepologyBlockingClient {
inner: crate::RepologyClient,
rt: tokio::runtime::Runtime,
}
impl RepologyBlockingClient {
pub fn new() -> Result<Self> {
Self::builder().build()
}
}
#[bon::bon]
impl RepologyBlockingClient {
#[builder]
pub fn builder(
#[builder(into, default = format!("repology-rs/{}", env!("CARGO_PKG_VERSION")))]
user_agent: String,
#[builder(into, default = "https://repology.org/api/v1".to_owned())] base_url: String,
#[builder(default = Duration::from_secs(1))] rate_limit: Duration,
reqwest_client: Option<reqwest::Client>,
) -> Result<Self> {
let inner = crate::RepologyClient::builder()
.user_agent(user_agent)
.base_url(base_url)
.rate_limit(rate_limit)
.maybe_reqwest_client(reqwest_client)
.build()?;
let rt = tokio::runtime::Runtime::new()
.map_err(|e| crate::error::Error::Config(format!("failed to create runtime: {e}")))?;
Ok(Self { inner, rt })
}
}
impl RepologyBlockingClient {
pub fn project(&self, name: &str) -> Result<Vec<Package>> {
self.rt.block_on(self.inner.project(name))
}
pub fn projects(&self, filter: &ProjectFilter) -> Result<HashMap<String, Vec<Package>>> {
self.rt.block_on(self.inner.projects(filter))
}
pub fn projects_page(
&self,
filter: &ProjectFilter,
cursor: Option<&str>,
) -> Result<HashMap<String, Vec<Package>>> {
self.rt.block_on(self.inner.projects_page(filter, cursor))
}
pub fn repository_problems(&self, repository: &str) -> Result<Vec<Problem>> {
self.rt.block_on(self.inner.repository_problems(repository))
}
pub fn repository_problems_page(
&self,
repository: &str,
cursor: Option<&str>,
) -> Result<Vec<Problem>> {
self.rt
.block_on(self.inner.repository_problems_page(repository, cursor))
}
pub fn maintainer_problems(&self, maintainer: &str, repository: &str) -> Result<Vec<Problem>> {
self.rt
.block_on(self.inner.maintainer_problems(maintainer, repository))
}
pub fn maintainer_problems_page(
&self,
maintainer: &str,
repository: &str,
cursor: Option<&str>,
) -> Result<Vec<Problem>> {
self.rt.block_on(
self.inner
.maintainer_problems_page(maintainer, repository, cursor),
)
}
}