omena_resolver/
runtime_query.rs1use 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}