use crate::handlers::ScopeExport;
use crate::wiki::links::LinkResolver;
use provenance_core::coverage::CoverageReport;
use provenance_core::{Edge, EdgeType, NodeType, Requirement, Source, StableId};
use provenance_store::cache::{GapItem, GraphQuery};
use std::cell::OnceCell;
use std::collections::BTreeMap;
pub(super) struct Assembler<'a> {
pub(super) state: &'a ScopeExport,
pub(super) resolver: &'a LinkResolver,
pub(super) coverage: Option<&'a CoverageReport>,
pub(super) gaps: &'a [GapItem],
pub(super) query: GraphQuery<'a, 'a>,
pub(super) rule_requirements: OnceCell<BTreeMap<&'a str, Vec<&'a Requirement>>>,
}
impl<'a> Assembler<'a> {
pub(super) fn edges(&self) -> impl Iterator<Item = &'a Edge> {
let scope = self.state.scope.as_str();
self.state
.edges
.iter()
.filter(move |edge| edge.scope_id.as_str() == scope)
}
pub(super) fn edge_exists(
&self,
edge_type: EdgeType,
from_type: NodeType,
from_id: &StableId,
to_type: NodeType,
to_id: &StableId,
) -> bool {
self.edges().any(|edge| {
edge.edge_type == edge_type
&& edge.from_type == from_type
&& edge.from_id == *from_id
&& edge.to_type == to_type
&& edge.to_id == *to_id
})
}
pub(super) fn find_requirement(&self, id: &StableId) -> Option<&'a Requirement> {
self.state
.requirements
.iter()
.find(|requirement| requirement.id == *id)
}
pub(super) fn find_source(&self, id: &StableId) -> Option<&'a Source> {
self.state.sources.iter().find(|source| source.id == *id)
}
}