mod graph;
pub mod provider;
mod target;
use std::collections::BTreeSet;
use anyhow::Result;
use futures::stream::BoxStream;
use futures::StreamExt;
pub use self::graph::TargetGraph;
pub use self::target::Target;
pub trait Resolve {
fn resolve_fallible(&self, target: Target) -> BoxStream<Result<Target>>;
fn resolve(&self, target: Target) -> BoxStream<Target> {
self.resolve_fallible(target)
.map(futures::stream::iter)
.flatten()
.boxed()
}
fn bulk_resolve_fallible(&self, targets: Vec<Target>) -> BoxStream<Result<Target>>
where
Self: Sync,
{
futures::stream::iter(targets)
.map(|t| self.resolve_fallible(t))
.flatten()
.boxed()
}
fn bulk_resolve(&self, targets: Vec<Target>) -> BoxStream<Target>
where
Self: Sync,
{
self.bulk_resolve_fallible(targets)
.map(futures::stream::iter)
.flatten()
.boxed()
}
}
pub trait ResolveExt: Resolve {
async fn resolve_set(&self, target: Target) -> BTreeSet<Target>;
async fn resolve_into_set(&self, target: Target, set: &mut BTreeSet<Target>);
async fn resolve_into_graph(&self, target: Target, graph: &mut TargetGraph);
async fn resolve_into_graph_reverse(&self, target: Target, graph: &mut TargetGraph);
async fn bulk_resolve_set(&self, targets: Vec<Target>) -> BTreeSet<Target>
where
Self: Sync;
async fn bulk_resolve_into_set(&self, targets: Vec<Target>, set: &mut BTreeSet<Target>)
where
Self: Sync;
}
impl<R> ResolveExt for R
where
R: Resolve,
{
async fn resolve_set(&self, target: Target) -> BTreeSet<Target> {
self.resolve(target).collect().await
}
async fn resolve_into_set(&self, target: Target, set: &mut BTreeSet<Target>) {
let mut targets = self.resolve(target);
while let Some(target) = targets.next().await {
set.insert(target);
}
}
async fn resolve_into_graph(&self, target: Target, graph: &mut TargetGraph) {
let parent = target.clone().intern();
graph.add_node(parent);
let mut targets = self.resolve(target);
while let Some(child) = targets.next().await {
if child != *parent {
graph.add_edge(parent, child.intern());
}
}
}
async fn resolve_into_graph_reverse(&self, target: Target, graph: &mut TargetGraph) {
let child = target.clone().intern();
graph.add_node(child);
let mut targets = self.resolve(target);
while let Some(parent) = targets.next().await {
if parent != *child {
graph.add_edge(parent.intern(), child);
}
}
}
async fn bulk_resolve_set(&self, targets: Vec<Target>) -> BTreeSet<Target>
where
Self: Sync,
{
self.bulk_resolve(targets).collect().await
}
async fn bulk_resolve_into_set(&self, targets: Vec<Target>, set: &mut BTreeSet<Target>)
where
Self: Sync,
{
let mut targets = self.bulk_resolve(targets);
while let Some(target) = targets.next().await {
set.insert(target);
}
}
}