diff --git a/src/fetchers.rs b/src/fetchers.rs index 237a2b85..dc60dfc6 100644 --- a/src/fetchers.rs +++ b/src/fetchers.rs @@ -47,30 +47,21 @@ pub struct Data { pub meta: PkgMeta, } +type FetcherJoinHandle = AutoAbortJoinHandle>; + #[derive(Default)] -pub struct MultiFetcher { - fetchers: Vec>, -} +pub struct MultiFetcher(Vec<(Arc, FetcherJoinHandle)>); impl MultiFetcher { pub fn add(&mut self, fetcher: Arc) { - self.fetchers.push(fetcher); + self.0.push(( + fetcher.clone(), + AutoAbortJoinHandle::new(tokio::spawn(async move { fetcher.check().await })), + )); } - pub async fn first_available(&self) -> Option> { - let handles: Vec<_> = self - .fetchers - .iter() - .cloned() - .map(|fetcher| { - ( - fetcher.clone(), - AutoAbortJoinHandle::new(tokio::spawn(async move { fetcher.check().await })), - ) - }) - .collect(); - - for (fetcher, handle) in handles { + pub async fn first_available(self) -> Option> { + for (fetcher, handle) in self.0 { match handle.await { Ok(Ok(true)) => return Some(fetcher), Ok(Ok(false)) => (),