in focus/internals/src/lib/target_resolver/mod.rs [147:208]
fn resolve(
&self,
request: &ResolutionRequest,
cache_options: &CacheOptions,
app: Arc<App>,
) -> Result<ResolutionResult> {
use rayon::prelude::*;
let subrequests = {
let mut bazel_targets = HashSet::new();
let mut directory_targets = HashSet::new();
for target in request.targets.iter().cloned() {
match target {
target @ Target::Bazel(_) => {
bazel_targets.insert(target);
}
target @ Target::Directory(_) => {
directory_targets.insert(target);
}
}
}
let bazel_subrequest = ResolutionRequest {
targets: bazel_targets,
..request.clone()
};
let directory_subrequest = ResolutionRequest {
targets: directory_targets,
..request.clone()
};
vec![bazel_subrequest, directory_subrequest]
};
subrequests
.par_iter()
.map(|subrequest| {
let app_clone = app.clone();
match subrequest.targets.iter().next() {
Some(Target::Bazel(_)) => {
match subrequest.options.bazel_resolution_strategy {
BazelResolutionStrategy::Incremental => self
.incremental_bazel_resolver
.resolve(subrequest, cache_options, app_clone),
BazelResolutionStrategy::OneShot => self
.oneshot_bazel_resolver
.resolve(subrequest, cache_options, app_clone),
}
}
Some(Target::Directory(_)) => {
self.directory_resolver
.resolve(subrequest, cache_options, app_clone)
}
None => Ok(Default::default()),
}
})
.try_reduce(ResolutionResult::new, |mut acc, result| {
acc.merge(result);
Ok(acc)
})
.context("Resolving targets failed")
}