Skip to main content

omena_resolver/
runtime_query.rs

1use super::*;
2
3pub fn summarize_omena_resolver_runtime_query_boundary(
4    module_graph: &OmenaResolverModuleGraphSummaryV0,
5) -> OmenaResolverRuntimeQueryBoundarySummaryV0 {
6    let module_queries = module_graph
7        .modules
8        .iter()
9        .map(runtime_module_query_from_graph_module)
10        .collect::<Vec<_>>();
11    let fully_resolvable_module_count = module_queries
12        .iter()
13        .filter(|module| module.status == "ready")
14        .count();
15    let source_only_module_count = module_graph
16        .modules
17        .iter()
18        .filter(|module| module.has_source_input && !module.has_style_input)
19        .count();
20    let style_only_module_count = module_graph
21        .modules
22        .iter()
23        .filter(|module| module.has_style_input && !module.has_source_input)
24        .count();
25    let mut blocking_gaps = Vec::new();
26
27    if module_graph.module_count == 0 {
28        blocking_gaps.push("emptyModuleGraph");
29    }
30    if fully_resolvable_module_count < module_graph.module_count {
31        blocking_gaps.push("partialModuleCoverage");
32    }
33    if module_graph.unresolved_type_fact_count > 0 {
34        blocking_gaps.push("unresolvedTypeFactEdges");
35    }
36
37    OmenaResolverRuntimeQueryBoundarySummaryV0 {
38        schema_version: "0",
39        product: "omena-resolver.runtime-query-boundary",
40        input_product: module_graph.product.clone(),
41        input_version: module_graph.input_version.clone(),
42        module_query_count: module_queries.len(),
43        fully_resolvable_module_count,
44        source_only_module_count,
45        style_only_module_count,
46        unresolved_type_fact_count: module_graph.unresolved_type_fact_count,
47        runtime_capabilities: vec![
48            "moduleLookupByStylePath",
49            "sourceExpressionEdgeLookup",
50            "typeFactEdgeLookup",
51            "selectorNameLookup",
52        ],
53        blocking_gaps,
54        module_queries,
55    }
56}
57
58pub fn query_omena_resolver_runtime_module(
59    module_graph: &OmenaResolverModuleGraphSummaryV0,
60    style_file_path: &str,
61) -> Option<OmenaResolverRuntimeModuleQueryV0> {
62    module_graph
63        .modules
64        .iter()
65        .find(|module| module.style_file_path == style_file_path)
66        .map(runtime_module_query_from_graph_module)
67}
68
69fn runtime_module_query_from_graph_module(
70    module: &OmenaResolverModuleGraphModuleV0,
71) -> OmenaResolverRuntimeModuleQueryV0 {
72    OmenaResolverRuntimeModuleQueryV0 {
73        style_file_path: module.style_file_path.clone(),
74        source_expression_ids: module.source_expression_ids.clone(),
75        type_fact_expression_ids: module.type_fact_expression_ids.clone(),
76        selector_names: module.selector_names.clone(),
77        canonical_selector_names: module.canonical_selector_names.clone(),
78        can_resolve_source_expressions: module.has_source_input && module.has_style_input,
79        can_check_type_fact_edges: module.has_source_input && module.has_type_fact_input,
80        can_query_selector_names: module.has_style_input,
81        status: module_runtime_status(module),
82    }
83}
84
85fn module_runtime_status(module: &OmenaResolverModuleGraphModuleV0) -> &'static str {
86    if module.has_source_input && module.has_style_input && module.has_type_fact_input {
87        "ready"
88    } else if module.has_source_input && !module.has_style_input {
89        "sourceOnly"
90    } else if module.has_style_input && !module.has_source_input {
91        "styleOnly"
92    } else {
93        "partial"
94    }
95}