provenance-cli 0.2.1

Command-line interface for Provenance requirements traceability
use crate::wiki::model::{PageId, PageLink, RecordKind, SourcePage};
use provenance_core::{EdgeType, NodeType, Source};

use super::super::context::Assembler;
use super::super::page_links::{requirement_link, source_link};

impl<'a> Assembler<'a> {
    pub(in crate::wiki::assemble) fn source_page(&self, source: &'a Source) -> SourcePage {
        let referenced_requirements: Vec<PageLink> = self
            .state
            .requirements
            .iter()
            .filter(|requirement| {
                self.edge_exists(
                    EdgeType::References,
                    NodeType::Source,
                    &source.id,
                    NodeType::Requirement,
                    &requirement.id,
                ) || requirement
                    .source_refs
                    .iter()
                    .any(|reference| reference.source_id == source.id)
            })
            .map(requirement_link)
            .collect();
        let superseded_by = source
            .superseded_by
            .as_ref()
            .and_then(|id| self.find_source(id).map(source_link));
        SourcePage {
            id: PageId::new(RecordKind::Source, source.id.as_str()),
            title: source.name.clone(),
            source_type: source.source_type.clone(),
            url: source.url.clone(),
            reference: self.source_reference_link(source),
            commit_pin: source.commit_pin.clone(),
            effective_date: source.effective_date,
            review_date: source.review_date,
            superseded_by,
            referenced_requirements,
            gaps: self.gaps_for(NodeType::Source, &source.id),
            threads: self.threads_for(NodeType::Source, &source.id),
        }
    }
}