omena-resolver 0.1.14

Omena resolver boundary over CME source-resolution producer contracts
Documentation
use super::*;

pub fn summarize_omena_resolver_runtime_query_boundary(
    module_graph: &OmenaResolverModuleGraphSummaryV0,
) -> OmenaResolverRuntimeQueryBoundarySummaryV0 {
    let module_queries = module_graph
        .modules
        .iter()
        .map(runtime_module_query_from_graph_module)
        .collect::<Vec<_>>();
    let fully_resolvable_module_count = module_queries
        .iter()
        .filter(|module| module.status == "ready")
        .count();
    let source_only_module_count = module_graph
        .modules
        .iter()
        .filter(|module| module.has_source_input && !module.has_style_input)
        .count();
    let style_only_module_count = module_graph
        .modules
        .iter()
        .filter(|module| module.has_style_input && !module.has_source_input)
        .count();
    let mut blocking_gaps = Vec::new();

    if module_graph.module_count == 0 {
        blocking_gaps.push("emptyModuleGraph");
    }
    if fully_resolvable_module_count < module_graph.module_count {
        blocking_gaps.push("partialModuleCoverage");
    }
    if module_graph.unresolved_type_fact_count > 0 {
        blocking_gaps.push("unresolvedTypeFactEdges");
    }

    OmenaResolverRuntimeQueryBoundarySummaryV0 {
        schema_version: "0",
        product: "omena-resolver.runtime-query-boundary",
        input_product: module_graph.product.clone(),
        input_version: module_graph.input_version.clone(),
        module_query_count: module_queries.len(),
        fully_resolvable_module_count,
        source_only_module_count,
        style_only_module_count,
        unresolved_type_fact_count: module_graph.unresolved_type_fact_count,
        runtime_capabilities: vec![
            "moduleLookupByStylePath",
            "sourceExpressionEdgeLookup",
            "typeFactEdgeLookup",
            "selectorNameLookup",
        ],
        blocking_gaps,
        module_queries,
    }
}

pub fn query_omena_resolver_runtime_module(
    module_graph: &OmenaResolverModuleGraphSummaryV0,
    style_file_path: &str,
) -> Option<OmenaResolverRuntimeModuleQueryV0> {
    module_graph
        .modules
        .iter()
        .find(|module| module.style_file_path == style_file_path)
        .map(runtime_module_query_from_graph_module)
}

fn runtime_module_query_from_graph_module(
    module: &OmenaResolverModuleGraphModuleV0,
) -> OmenaResolverRuntimeModuleQueryV0 {
    OmenaResolverRuntimeModuleQueryV0 {
        style_file_path: module.style_file_path.clone(),
        source_expression_ids: module.source_expression_ids.clone(),
        type_fact_expression_ids: module.type_fact_expression_ids.clone(),
        selector_names: module.selector_names.clone(),
        canonical_selector_names: module.canonical_selector_names.clone(),
        can_resolve_source_expressions: module.has_source_input && module.has_style_input,
        can_check_type_fact_edges: module.has_source_input && module.has_type_fact_input,
        can_query_selector_names: module.has_style_input,
        status: module_runtime_status(module),
    }
}

fn module_runtime_status(module: &OmenaResolverModuleGraphModuleV0) -> &'static str {
    if module.has_source_input && module.has_style_input && module.has_type_fact_input {
        "ready"
    } else if module.has_source_input && !module.has_style_input {
        "sourceOnly"
    } else if module.has_style_input && !module.has_source_input {
        "styleOnly"
    } else {
        "partial"
    }
}