Skip to main content

mecha10_cli/dev/
node_selection.rs

1//! Node selection logic for development mode
2
3use crate::types::{NodeSpec, ProjectConfig};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct NodeToRun {
7    pub name: String,
8    pub identifier: String,
9    pub path: String,
10    pub is_framework_node: bool,
11}
12
13impl NodeToRun {
14    /// Create a new NodeToRun from NodeSpec
15    pub fn from_spec(spec: &NodeSpec) -> Self {
16        Self {
17            name: spec.name.clone(),
18            identifier: spec.identifier.clone(),
19            path: spec.package_path(),
20            is_framework_node: spec.is_framework(),
21        }
22    }
23}
24
25/// Get list of nodes to run based on configuration
26pub fn get_nodes_to_run(requested_nodes: &[String], project_config: &ProjectConfig) -> Vec<NodeToRun> {
27    let all_specs = project_config.nodes.get_node_specs();
28
29    let specs_to_run: Vec<NodeSpec> = if requested_nodes.is_empty() {
30        all_specs
31    } else {
32        all_specs
33            .into_iter()
34            .filter(|s| requested_nodes.contains(&s.name))
35            .collect()
36    };
37
38    specs_to_run.iter().map(NodeToRun::from_spec).collect()
39}
40
41/// Get list of all available node names
42pub fn get_available_node_names(project_config: &ProjectConfig) -> Vec<String> {
43    project_config.nodes.get_node_names()
44}
45
46/// Get list of enabled node names
47///
48/// Note: In the new format, all nodes in the list are considered "enabled".
49/// Use lifecycle modes to control which nodes run in different contexts.
50#[allow(dead_code)]
51pub fn get_enabled_node_names(project_config: &ProjectConfig) -> Vec<String> {
52    project_config.nodes.get_node_names()
53}
54
55/// Check if a node is a framework node by name
56#[allow(dead_code)]
57pub fn is_framework_node(project_config: &ProjectConfig, name: &str) -> bool {
58    project_config
59        .nodes
60        .find_by_name(name)
61        .map(|s| s.is_framework())
62        .unwrap_or(false)
63}