← back to kornia__bubbaloop

Function bodies 699 total

All specs Real LLM only Function bodies
spawn_refresh_and_emit function · rust · L758-L768 (11 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn spawn_refresh_and_emit(self: &Arc<Self>, event_type: &str, name: &str) {
        let manager = Arc::clone(self);
        let event_type = event_type.to_string();
        let node_name = name.to_string();
        tokio::spawn(async move {
            if let Err(e) = manager.refresh_all().await {
                log::warn!("Failed to refresh after {}: {}", event_type, e);
            }
            manager.emit_event(&event_type, &node_name).await;
        });
    }
start_node function · rust · L771-L776 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn start_node(self: &Arc<Self>, name: &str) -> Result<String> {
        let service_name = systemd::get_service_name(name);
        self.systemd.start_unit(&service_name).await?;
        self.spawn_refresh_and_emit("started", name);
        Ok(format!("Started {}", name))
    }
stop_node function · rust · L779-L784 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn stop_node(self: &Arc<Self>, name: &str) -> Result<String> {
        let service_name = systemd::get_service_name(name);
        self.systemd.stop_unit(&service_name).await?;
        self.spawn_refresh_and_emit("stopped", name);
        Ok(format!("Stopped {}", name))
    }
restart_node function · rust · L787-L792 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn restart_node(self: &Arc<Self>, name: &str) -> Result<String> {
        let service_name = systemd::get_service_name(name);
        self.systemd.restart_unit(&service_name).await?;
        self.spawn_refresh_and_emit("restarted", name);
        Ok(format!("Restarted {}", name))
    }
install_node function · rust · L795-L832 (38 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn install_node(self: &Arc<Self>, name: &str) -> Result<String> {
        // Look up by effective name (the HashMap key)
        let nodes = self.nodes.read().await;
        let node = nodes
            .get(name)
            .ok_or_else(|| NodeManagerError::NodeNotFound(name.to_string()))?;

        let path = node.path.clone();
        let manifest = node
            .manifest
            .as_ref()
            .ok_or_else(|| NodeManagerError::NodeNotFound(name.to_string()))?;

        // If config_override is set, append -c <config> to the command
        let command = if let Some(ref config_path) = node.config_override {
            let base_cmd = manifest
                .command
                .as_deref()
                .unwrap_or("./target/release/unknown");
            Some(format!("{} -c {}", base_cmd, config_path))
        } else {
            manifest.command.clone()
        };

        systemd::install_service(
            &path,
            name,
            &ma
stop_if_running function · rust · L843-L860 (18 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn stop_if_running(&self, name: &str) {
        let service_name = systemd::get_service_name(name);
        match self.systemd.get_active_state(&service_name).await {
            Ok(ActiveState::Active | ActiveState::Activating) => {
                log::info!("Stopping {} before build/clean", name);
                let _ = self.systemd.stop_unit(&service_name).await;
                tokio::time::sleep(Duration::from_millis(500)).await;
            }
            Err(e) => {
                log::warn!(
                    "Could not check state of {} ({}), proceeding anyway",
                    name,
                    e
                );
            }
            _ => {}
        }
    }
begin_build_activity function · rust · L865-L890 (26 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn begin_build_activity(
        &self,
        name: &str,
        status: BuildStatus,
        start_event: &str,
    ) -> Result<String> {
        let path = self.find_node_path(name).await?;
        self.stop_if_running(name).await;

        let mut building = self.building_nodes.lock().await;
        if !building.insert(name.to_string()) {
            return Err(NodeManagerError::AlreadyBuilding(name.to_string()));
        }
        drop(building);

        let mut nodes = self.nodes.write().await;
        if let Some(node) = nodes.get_mut(name) {
            node.build_state.status = status;
            node.build_state.output.clear();
            node.status = NodeStatus::Building;
        }
        drop(nodes);

        self.emit_event(start_event, name).await;
        Ok(path)
    }
Repobility · open methodology · https://repobility.com/research/
build_node function · rust · L893-L940 (48 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn build_node(self: &Arc<Self>, manager: Arc<Self>, name: &str) -> Result<String> {
        let path = self
            .begin_build_activity(name, BuildStatus::Building, "building")
            .await?;

        // Get build command
        let build_cmd = {
            let nodes = self.nodes.read().await;
            let node = nodes
                .get(name)
                .ok_or_else(|| NodeManagerError::NodeNotFound(name.to_string()))?;
            node.manifest
                .as_ref()
                .and_then(|m| m.build.clone())
                .ok_or_else(|| {
                    NodeManagerError::BuildError("No build command defined".to_string())
                })?
        };

        let name_clone = name.to_string();
        let path_clone = path.clone();

        tokio::spawn(async move {
            let result = run_with_timeout(&manager, &path_clone, &build_cmd, &name_clone).await;

            finish_build_activity(&manager, &name_clone, &result, "Build")
clean_node function · rust · L943-L973 (31 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn clean_node(self: &Arc<Self>, manager: Arc<Self>, name: &str) -> Result<String> {
        let path = self
            .begin_build_activity(name, BuildStatus::Cleaning, "cleaning")
            .await?;

        let name_clone = name.to_string();
        let path_clone = path.clone();

        tokio::spawn(async move {
            let result =
                run_with_timeout(&manager, &path_clone, "pixi run clean", &name_clone).await;

            finish_build_activity(&manager, &name_clone, &result, "Clean").await;

            let _ = manager.refresh_all().await;

            // Force is_built = false after refresh for successful cleans.
            // refresh_all() re-checks the filesystem, which may still find
            // artifacts if the clean process hasn't fully flushed yet.
            {
                let mut nodes = manager.nodes.write().await;
                if let Some(node) = nodes.get_mut(&name_clone) {
                    node.is_built = false;
         
enable_autostart function · rust · L976-L984 (9 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn enable_autostart(&self, name: &str) -> Result<String> {
        let service_name = systemd::get_service_name(name);
        self.systemd.enable_unit(&service_name).await?;

        self.refresh_all().await?;
        self.emit_event("autostart_enabled", name).await;

        Ok(format!("Enabled autostart for {}", name))
    }
disable_autostart function · rust · L987-L995 (9 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn disable_autostart(&self, name: &str) -> Result<String> {
        let service_name = systemd::get_service_name(name);
        self.systemd.disable_unit(&service_name).await?;

        self.refresh_all().await?;
        self.emit_event("autostart_disabled", name).await;

        Ok(format!("Disabled autostart for {}", name))
    }
add_node function · rust · L998-L1010 (13 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn add_node(
        &self,
        path: &str,
        name_override: Option<&str>,
        config_override: Option<&str>,
    ) -> Result<String> {
        let (_manifest, eff_name) = registry::register_node(path, name_override, config_override)?;

        self.refresh_all().await?;
        self.emit_event("added", &eff_name).await;

        Ok(format!("Added node: {}", eff_name))
    }
remove_node function · rust · L1013-L1030 (18 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn remove_node(&self, name: &str) -> Result<String> {
        // Verify the node exists
        let _path = self.find_node_path(name).await?;

        // Uninstall service if installed before removing from registry
        if systemd::is_service_installed(name) {
            log::info!("Uninstalling service {} before removal", name);
            let _ = systemd::uninstall_service(name).await;
        }

        // Unregister by effective name (handles multi-instance correctly)
        registry::unregister_node(name)?;

        self.refresh_all().await?;
        self.emit_event("removed", name).await;

        Ok(format!("Removed node: {}", name))
    }
emit_event function · rust · L1033-L1045 (13 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    async fn emit_event(&self, event_type: &str, node_name: &str) {
        if let Some(state) = self.get_node(node_name).await {
            let event = NodeEvent {
                event_type: event_type.to_string(),
                node_name: node_name.to_string(),
                state: Some(state),
                timestamp_ms: Self::now_ms(),
            };

            // Ignore send errors (no subscribers)
            let _ = self.event_tx.send(event);
        }
    }
run_with_timeout function · rust · L1049-L1065 (17 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
async fn run_with_timeout(
    manager: &Arc<NodeManager>,
    path: &str,
    cmd: &str,
    name: &str,
) -> Result<()> {
    let timeout_duration = Duration::from_secs(BUILD_TIMEOUT_SECS);
    match tokio::time::timeout(
        timeout_duration,
        run_build_command(manager, path, cmd, name),
    )
    .await
    {
        Ok(result) => result,
        Err(_) => Err(NodeManagerError::BuildTimeout(name.to_string())),
    }
}
Source: Repobility analyzer · https://repobility.com
validate_build_command function · rust · L1091-L1120 (30 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
fn validate_build_command(cmd: &str) -> Result<()> {
    // Allowlist of permitted build command prefixes
    const ALLOWED_PREFIXES: &[&str] = &["cargo ", "pixi ", "npm ", "make ", "python ", "pip "];

    let cmd_lower = cmd.to_lowercase();
    let has_allowed_prefix = ALLOWED_PREFIXES
        .iter()
        .any(|prefix| cmd_lower.starts_with(prefix));

    if !has_allowed_prefix {
        return Err(NodeManagerError::BuildError(format!(
            "Build command must start with one of: cargo, pixi, npm, make, python, pip. Got: {}",
            cmd.chars().take(50).collect::<String>()
        )));
    }

    // Reject dangerous shell metacharacters
    const DANGEROUS_CHARS: &[char] = &[
        '$', '`', '|', ';', '&', '>', '<', '(', ')', '{', '}', '!', '\\', '\n', '\r',
    ];
    if let Some(bad_char) = cmd.chars().find(|c| DANGEROUS_CHARS.contains(c)) {
        return Err(NodeManagerError::BuildError(format!(
            "Build command contains dangerous character '{}': {}",
 
run_build_command function · rust · L1123-L1205 (83 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
async fn run_build_command(
    manager: &Arc<NodeManager>,
    path: &str,
    cmd: &str,
    name: &str,
) -> Result<()> {
    // Validate command before execution to prevent command injection
    validate_build_command(cmd)?;

    // Build a PATH that includes user tool directories (pixi, cargo, etc.)
    // so build commands like "pixi run build" work under systemd's minimal env.
    let home = dirs::home_dir().unwrap_or_else(|| std::path::PathBuf::from("/home/user"));
    let build_path = format!(
        "{}:{}:/usr/local/bin:/usr/bin:/bin",
        home.join(".cargo/bin").display(),
        home.join(".pixi/bin").display(),
    );

    let mut child = Command::new("sh")
        .args(["-c", cmd])
        .current_dir(path)
        .env("PATH", &build_path)
        .stdout(std::process::Stdio::piped())
        .stderr(std::process::Stdio::piped())
        .kill_on_drop(true) // Kill child process if future is dropped (e.g., on timeout)
        .spawn()?;

    let stdout = child.s
extract_health_node_name function · rust · L1212-L1229 (18 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
fn extract_health_node_name(key: &str) -> Option<String> {
    let parts: Vec<&str> = key.split('/').collect();
    if parts.is_empty() || parts[0] != "bubbaloop" {
        return None;
    }

    // Legacy format: bubbaloop/nodes/{name}/health
    if parts.len() >= 4 && parts[1] == "nodes" && parts[3] == "health" {
        return Some(parts[2].to_string());
    }

    // Scoped format: bubbaloop/{scope}/{machine}/health/{name}
    if parts.len() >= 5 && parts[3] == "health" {
        return Some(parts[4].to_string());
    }

    None
}
test_validate_build_command_allowed_prefixes function · rust · L1237-L1244 (8 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_validate_build_command_allowed_prefixes() {
        assert!(validate_build_command("cargo build --release").is_ok());
        assert!(validate_build_command("pixi run build").is_ok());
        assert!(validate_build_command("npm run build").is_ok());
        assert!(validate_build_command("make all").is_ok());
        assert!(validate_build_command("python setup.py build").is_ok());
        assert!(validate_build_command("pip install .").is_ok());
    }
test_validate_build_command_rejects_make_without_space function · rust · L1254-L1259 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_validate_build_command_rejects_make_without_space() {
        // "make" without a trailing space should not match arbitrary commands
        // like "makefile-exploit" or "makeover"
        assert!(validate_build_command("makefile-exploit").is_err());
        assert!(validate_build_command("makeover something").is_err());
    }
test_validate_build_command_rejects_shell_metacharacters function · rust · L1268-L1275 (8 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_validate_build_command_rejects_shell_metacharacters() {
        assert!(validate_build_command("cargo build; rm -rf /").is_err());
        assert!(validate_build_command("cargo build && evil").is_err());
        assert!(validate_build_command("cargo build | evil").is_err());
        assert!(validate_build_command("cargo build > /etc/passwd").is_err());
        assert!(validate_build_command("cargo build $(evil)").is_err());
        assert!(validate_build_command("cargo build `evil`").is_err());
    }
test_extract_health_node_name_legacy function · rust · L1278-L1283 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_extract_health_node_name_legacy() {
        assert_eq!(
            extract_health_node_name("bubbaloop/nodes/my-node/health"),
            Some("my-node".to_string())
        );
    }
test_extract_health_node_name_scoped function · rust · L1286-L1291 (6 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_extract_health_node_name_scoped() {
        assert_eq!(
            extract_health_node_name("bubbaloop/scope/machine1/health/my-node"),
            Some("my-node".to_string())
        );
    }
Provenance: Repobility (https://repobility.com) — every score reproducible from /scan/
test_cached_node_base_node_with_override function · rust · L1301-L1326 (26 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_cached_node_base_node_with_override() {
        let node = CachedNode {
            path: "/path/to/rtsp-camera".to_string(),
            manifest: Some(NodeManifest {
                name: "rtsp-camera".to_string(),
                version: "0.1.0".to_string(),
                description: "RTSP camera node".to_string(),
                node_type: "rust".to_string(),
                ..Default::default()
            }),
            status: NodeStatus::Stopped,
            installed: false,
            autostart_enabled: false,
            is_built: false,
            build_state: BuildState::default(),
            last_updated_ms: 0,
            health_status: HealthStatus::Unknown,
            last_health_check_ms: 0,
            name_override: Some("rtsp-camera-terrace".to_string()),
            config_override: None,
        };

        let proto = node.to_proto("machine1", "host1", &[]);
        assert_eq!(proto.name, "rtsp-camera-terrace");
        assert_eq!(proto.bas
test_cached_node_base_node_without_override function · rust · L1329-L1354 (26 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_cached_node_base_node_without_override() {
        let node = CachedNode {
            path: "/path/to/openmeteo".to_string(),
            manifest: Some(NodeManifest {
                name: "openmeteo".to_string(),
                version: "0.1.0".to_string(),
                description: "Weather node".to_string(),
                node_type: "rust".to_string(),
                ..Default::default()
            }),
            status: NodeStatus::Running,
            installed: true,
            autostart_enabled: false,
            is_built: true,
            build_state: BuildState::default(),
            last_updated_ms: 0,
            health_status: HealthStatus::Unknown,
            last_health_check_ms: 0,
            name_override: None,
            config_override: None,
        };

        let proto = node.to_proto("machine1", "host1", &[]);
        assert_eq!(proto.name, "openmeteo");
        assert_eq!(proto.base_node, "");
    }
test_multi_instance_cameras_base_node_tracking function · rust · L1360-L1477 (118 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_multi_instance_cameras_base_node_tracking() {
        let camera_manifest = NodeManifest {
            name: "rtsp-camera".to_string(),
            version: "0.2.0".to_string(),
            description: "RTSP camera node".to_string(),
            node_type: "rust".to_string(),
            build: Some("cargo build --release".to_string()),
            command: Some("./target/release/cameras_node".to_string()),
            ..Default::default()
        };

        let instances = vec![
            (
                "rtsp-camera-terrace",
                Some("rtsp-camera-terrace"),
                Some("/etc/bubbaloop/terrace.yaml"),
            ),
            (
                "rtsp-camera-garage",
                Some("rtsp-camera-garage"),
                Some("/etc/bubbaloop/garage.yaml"),
            ),
            ("rtsp-camera-entrance", Some("rtsp-camera-entrance"), None),
        ];

        let mut protos = Vec::new();

        for (expected_name, name_override, confi
test_cached_node_effective_name_with_override function · rust · L1487-L1509 (23 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_cached_node_effective_name_with_override() {
        let node = CachedNode {
            path: "/path/to/rtsp-camera".to_string(),
            manifest: Some(NodeManifest {
                name: "rtsp-camera".to_string(),
                version: "0.1.0".to_string(),
                description: "RTSP camera node".to_string(),
                node_type: "rust".to_string(),
                ..Default::default()
            }),
            status: NodeStatus::Stopped,
            installed: false,
            autostart_enabled: false,
            is_built: false,
            build_state: BuildState::default(),
            last_updated_ms: 0,
            health_status: HealthStatus::Unknown,
            last_health_check_ms: 0,
            name_override: Some("rtsp-camera-terrace".to_string()),
            config_override: None,
        };
        assert_eq!(node.effective_name(), "rtsp-camera-terrace");
    }
test_cached_node_effective_name_without_override function · rust · L1512-L1534 (23 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_cached_node_effective_name_without_override() {
        let node = CachedNode {
            path: "/path/to/openmeteo".to_string(),
            manifest: Some(NodeManifest {
                name: "openmeteo".to_string(),
                version: "0.1.0".to_string(),
                description: "Weather".to_string(),
                node_type: "rust".to_string(),
                ..Default::default()
            }),
            status: NodeStatus::Running,
            installed: true,
            autostart_enabled: false,
            is_built: true,
            build_state: BuildState::default(),
            last_updated_ms: 0,
            health_status: HealthStatus::Unknown,
            last_health_check_ms: 0,
            name_override: None,
            config_override: None,
        };
        assert_eq!(node.effective_name(), "openmeteo");
    }
test_cached_node_effective_name_no_manifest function · rust · L1537-L1553 (17 LOC)
crates/bubbaloop/src/daemon/node_manager.rs
    fn test_cached_node_effective_name_no_manifest() {
        let node = CachedNode {
            path: "/path/to/unknown".to_string(),
            manifest: None,
            status: NodeStatus::Stopped,
            installed: false,
            autostart_enabled: false,
            is_built: false,
            build_state: BuildState::default(),
            last_updated_ms: 0,
            health_status: HealthStatus::Unknown,
            last_health_check_ms: 0,
            name_override: None,
            config_override: None,
        };
        assert_eq!(node.effective_name(), "unknown");
    }
validate function · rust · L129-L212 (84 LOC)
crates/bubbaloop/src/daemon/registry.rs
    pub fn validate(&self) -> Result<()> {
        // Validate name: 1-64 chars, alphanumeric + hyphen + underscore
        if self.name.is_empty() || self.name.len() > 64 {
            return Err(RegistryError::InvalidNode(format!(
                "Node name must be 1-64 characters, got: {}",
                self.name.len()
            )));
        }
        if !self
            .name
            .chars()
            .all(|c| c.is_alphanumeric() || c == '-' || c == '_')
        {
            return Err(RegistryError::InvalidNode(format!(
                "Node name contains invalid characters: {}",
                self.name
            )));
        }

        // Validate version: basic semver check (contains digits and dots)
        if self.version.is_empty() {
            return Err(RegistryError::InvalidNode(
                "Node version cannot be empty".to_string(),
            ));
        }
        let has_digit = self.version.chars().any(|c| c.is_ascii_digit());
        if !has_d
load_registry function · rust · L248-L257 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn load_registry() -> Result<NodesRegistry> {
    let path = get_nodes_file();
    if !path.exists() {
        return Ok(NodesRegistry::default());
    }

    let content = fs::read_to_string(&path)?;
    let registry: NodesRegistry = serde_json::from_str(&content)?;
    Ok(registry)
}
Citation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
save_registry function · rust · L260-L268 (9 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn save_registry(registry: &NodesRegistry) -> Result<()> {
    let home = get_bubbaloop_home();
    fs::create_dir_all(&home)?;

    let path = get_nodes_file();
    let content = serde_json::to_string_pretty(registry)?;
    fs::write(path, content)?;
    Ok(())
}
read_manifest function · rust · L271-L287 (17 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn read_manifest(node_path: &Path) -> Result<NodeManifest> {
    let manifest_path = node_path.join("node.yaml");
    if !manifest_path.exists() {
        return Err(RegistryError::InvalidNode(format!(
            "No node.yaml found in {}",
            node_path.display()
        )));
    }

    let content = fs::read_to_string(&manifest_path)?;
    let manifest: NodeManifest = serde_yaml::from_str(&content)?;

    // Validate the manifest fields
    manifest.validate()?;

    Ok(manifest)
}
effective_name function · rust · L291-L297 (7 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn effective_name(entry: &NodeEntry, manifest: &NodeManifest) -> String {
    entry
        .name_override
        .as_deref()
        .unwrap_or(&manifest.name)
        .to_string()
}
register_node function · rust · L303-L373 (71 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn register_node(
    node_path: &str,
    name_override: Option<&str>,
    config_override: Option<&str>,
) -> Result<(NodeManifest, String)> {
    let path = Path::new(node_path);

    // Check directory exists
    if !path.exists() {
        return Err(RegistryError::InvalidNode(format!(
            "Directory not found: {}",
            node_path
        )));
    }

    // Read and validate manifest
    let manifest = read_manifest(path)?;

    // Determine effective name
    let eff_name = name_override.unwrap_or(&manifest.name).to_string();

    // Validate override name if provided (same rules as manifest name)
    if let Some(override_name) = name_override {
        if override_name.is_empty() || override_name.len() > 64 {
            return Err(RegistryError::InvalidNode(format!(
                "Instance name must be 1-64 characters, got: {}",
                override_name.len()
            )));
        }
        if !override_name
            .chars()
            .all(|c|
unregister_node function · rust · L379-L434 (56 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn unregister_node(name_or_path: &str) -> Result<()> {
    let mut registry = load_registry()?;

    let initial_len = registry.nodes.len();

    // Try matching by effective name first
    registry.nodes.retain(|entry| {
        let entry_path = Path::new(&entry.path);

        // Try to match by effective name (manifest-based or name_override)
        if let Ok(manifest) = read_manifest(entry_path) {
            let eff = effective_name(entry, &manifest);
            if eff == name_or_path {
                return false; // remove this entry
            }
        } else {
            // Directory deleted - still try to match by name_override or directory name
            if let Some(ref name_ov) = entry.name_override {
                if name_ov == name_or_path {
                    log::warn!(
                        "Node directory '{}' was already deleted, removing registry entry",
                        entry.path
                    );
                    return false; // r
list_nodes function · rust · L440-L454 (15 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn list_nodes() -> Result<Vec<(NodeEntry, Option<NodeManifest>)>> {
    let registry = load_registry()?;

    let nodes = registry
        .nodes
        .iter()
        .map(|entry| {
            let path = Path::new(&entry.path);
            let manifest = read_manifest(path).ok();
            (entry.clone(), manifest)
        })
        .collect();

    Ok(nodes)
}
check_is_built function · rust · L457-L473 (17 LOC)
crates/bubbaloop/src/daemon/registry.rs
pub fn check_is_built(node_path: &str, manifest: &NodeManifest) -> bool {
    let path = Path::new(node_path);

    if let Some(ref command) = manifest.command {
        let binary_path = path.join(command);
        binary_path.exists()
    } else if manifest.node_type == "rust" {
        // Check for target/release or target/debug binary
        let release_path = path.join("target/release").join(&manifest.name);
        let debug_path = path.join("target/debug").join(&manifest.name);
        release_path.exists() || debug_path.exists()
    } else {
        // Python - check for main.py and venv
        let main_py = path.join("main.py");
        main_py.exists()
    }
}
chrono_now function · rust · L476-L486 (11 LOC)
crates/bubbaloop/src/daemon/registry.rs
fn chrono_now() -> String {
    use std::time::{SystemTime, UNIX_EPOCH};
    let duration = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap_or_default();
    let secs = duration.as_secs();

    // Simple ISO format without external dependencies
    // This is good enough for our purposes
    format!("{}000", secs)
}
Repobility · open methodology · https://repobility.com/research/
test_manifest_validation_valid function · rust · L499-L511 (13 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_valid() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "A test node".to_string(),
            author: Some("Test Author".to_string()),
            build: Some("cargo build --release".to_string()),
            command: Some("./target/release/test-node".to_string()),
            ..Default::default()
        };
        assert!(manifest.validate().is_ok());
    }
test_manifest_validation_empty_name function · rust · L514-L523 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_empty_name() {
        let manifest = NodeManifest {
            name: "".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_name_too_long function · rust · L526-L535 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_name_too_long() {
        let manifest = NodeManifest {
            name: "a".repeat(65),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_invalid_name_chars function · rust · L538-L547 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_invalid_name_chars() {
        let manifest = NodeManifest {
            name: "test node!".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_valid_name_with_underscores_hyphens function · rust · L550-L559 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_valid_name_with_underscores_hyphens() {
        let manifest = NodeManifest {
            name: "test_node-123".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_ok());
    }
test_manifest_validation_empty_version function · rust · L562-L571 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_empty_version() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_version_no_digits function · rust · L574-L583 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_version_no_digits() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "alpha".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_invalid_node_type function · rust · L586-L595 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_invalid_node_type() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "1.0.0".to_string(),
            node_type: "javascript".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
Source: Repobility analyzer · https://repobility.com
test_manifest_validation_python_type function · rust · L598-L607 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_python_type() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "1.0.0".to_string(),
            node_type: "python".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_ok());
    }
test_manifest_validation_description_too_long function · rust · L610-L619 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_description_too_long() {
        let manifest = NodeManifest {
            name: "test-node".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "a".repeat(501),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
test_manifest_validation_null_bytes_in_name function · rust · L622-L631 (10 LOC)
crates/bubbaloop/src/daemon/registry.rs
    fn test_manifest_validation_null_bytes_in_name() {
        let manifest = NodeManifest {
            name: "test\0node".to_string(),
            version: "1.0.0".to_string(),
            node_type: "rust".to_string(),
            description: "Test".to_string(),
            ..Default::default()
        };
        assert!(manifest.validate().is_err());
    }
‹ prevpage 5 / 14next ›