Skip to main content

eth_icons/client/
mod.rs

1use std::sync::Arc;
2
3use futures_util::future::join_all;
4
5use crate::{IconFetcher, IconQuery, IconSource, result::SourceResult};
6use builder::IconClientBuilder;
7
8pub mod builder;
9
10pub struct IconClient {
11    fetcher: IconFetcher,
12    sources: Vec<Arc<dyn IconSource>>,
13}
14
15impl IconClient {
16    pub fn new() -> Self {
17        Self::builder().with_defaults().build()
18    }
19
20    pub fn builder() -> IconClientBuilder {
21        IconClientBuilder::new()
22    }
23
24    pub fn fetcher(&self) -> &IconFetcher {
25        &self.fetcher
26    }
27
28    pub fn sources(&self) -> &[Arc<dyn IconSource>] {
29        &self.sources
30    }
31
32    pub async fn resolve(&self, query: IconQuery) -> Vec<SourceResult> {
33        join_all(self.sources.iter().map(|source| async {
34            SourceResult {
35                source: source.name(),
36                result: source.fetch(&self.fetcher, &query).await,
37            }
38        }))
39        .await
40    }
41}
42
43impl Default for IconClient {
44    fn default() -> Self {
45        Self::new()
46    }
47}