use std::future::Future;
use std::marker::PhantomData;
use crate::collector::Collector;
pub struct SatayCollector<M, T, Fut, Rec> {
name: String,
client: reqwest::Client,
make: M,
transform: T,
_marker: PhantomData<fn() -> (Fut, Rec)>,
}
impl<M, T, Fut, Rec> SatayCollector<M, T, Fut, Rec> {
pub fn new(name: impl Into<String>, client: reqwest::Client, make: M, transform: T) -> Self {
Self {
name: name.into(),
client,
make,
transform,
_marker: PhantomData,
}
}
}
impl<M, T, Fut, Resp, Rec> Collector for SatayCollector<M, T, Fut, Rec>
where
M: FnMut(reqwest::Client) -> Fut + Send,
Fut: Future<Output = Result<Resp, satay_reqwest::Error>> + Send,
T: FnMut(Resp) -> Vec<Rec> + Send,
Rec: Send + 'static,
{
type Record = Rec;
type Error = satay_reqwest::Error;
fn name(&self) -> &str {
&self.name
}
async fn collect(&mut self) -> Result<Vec<Rec>, satay_reqwest::Error> {
let response = (self.make)(self.client.clone()).await?;
Ok((self.transform)(response))
}
}