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}