provenance-cli 0.2.1

Command-line interface for Provenance requirements traceability
use crate::wiki::model::{
    CorpusCounts, DomainIndexPage, DomainState, HomepageDomain, ScopeIndexPage, SearchIndexPage,
    HOMEPAGE_DOMAIN_ROW_CAP,
};

use super::super::context::Assembler;
use super::super::page_links::{display_identifier, reader_title};

impl Assembler<'_> {
    pub(in crate::wiki::assemble) fn index_page(
        &self,
        domains: &DomainIndexPage,
        search: &SearchIndexPage,
        unfinished_count: usize,
    ) -> ScopeIndexPage {
        let authored_domain_count = domains
            .groups
            .iter()
            .filter(|group| matches!(group.state, DomainState::Defined { .. }))
            .count();
        let domains = domains
            .groups
            .iter()
            .filter_map(|group| match &group.state {
                DomainState::Defined {
                    id,
                    name,
                    description,
                } => Some(HomepageDomain {
                    id: id.clone(),
                    name: name.clone(),
                    description: description.clone(),
                    requirements: group.requirements.len(),
                    rules: group.rules.len(),
                }),
                DomainState::Missing { .. } | DomainState::Unassigned => None,
            })
            .take(HOMEPAGE_DOMAIN_ROW_CAP)
            .collect();
        ScopeIndexPage {
            scope: self.state.scope.clone(),
            title: reader_title(&format!(
                "{} documentation",
                display_identifier(&self.state.scope)
            )),
            counts: CorpusCounts {
                sources: self.state.sources.len(),
                requirements: self.state.requirements.len(),
                resolutions: self.state.resolutions.len(),
                rules: self.state.rules.len(),
            },
            search_coverage: search.coverage.clone(),
            search_example: search.example.clone(),
            domains,
            authored_domain_count,
            unfinished_count,
        }
    }
}