omni_forge/image_builder/ensure/
mod.rs

1use anyhow::Context;
2
3use super::common::InstallationStatus;
4use super::ensure_npm::install_node_platform;
5use super::ensure_docker::install_docker_platform;
6use super::ensure_devcontainers_cli::install_devcontainers;
7use std::io;
8use std::process::Command;
9use anyhow::Result;
10
11pub mod common;
12pub mod ensure_npm;
13pub mod ensure_docker;
14pub mod ensure_devcontainers_cli;
15
16pub fn ensure_installations() -> Result<InstallationStatus> {
17    let mut status = InstallationStatus {
18        node: false,
19        npm: false,
20        docker: false,
21        devcontainers: false,
22    };
23
24    // Check Node.js
25    match Command::new("node").arg("--version").output() {
26        Ok(output) if output.status.success() => {
27            println!("Node.js is installed: {}", String::from_utf8_lossy(&output.stdout));
28            status.node = true;
29        },
30        _ => {
31            println!("Installing Node.js...");
32            install_node_platform().context("failed to install node platform")?;
33            status.node = true;
34        }
35    }
36
37    // Check NPM
38    match Command::new("npm").arg("--version").output() {
39        Ok(output) if output.status.success() => {
40            println!("NPM is installed: {}", String::from_utf8_lossy(&output.stdout));
41            status.npm = true;
42        },
43        _ => {
44            println!("NPM not found. Attempting to install NPM...");
45            Command::new("npm").arg("install").arg("-g").arg("npm").status().context("Failed to instll with npm")?;
46            match Command::new("npm").arg("--version").output() {
47                Ok(output) if output.status.success() => {
48                    println!("NPM is installed: {}", String::from_utf8_lossy(&output.stdout));
49                    status.npm = true;
50                },
51                _ => {
52                    return Err::<InstallationStatus, anyhow::Error>(io::Error::new(io::ErrorKind::NotFound, "NPM installation failed").into());
53                }
54            }
55        }
56    }
57
58    // Check Docker
59    match Command::new("docker").arg("--version").output() {
60        Ok(output) if output.status.success() => {
61            println!("Docker is installed: {}", String::from_utf8_lossy(&output.stdout));
62            status.docker = true;
63        },
64        _ => {
65            println!("Installing Docker...");
66            install_docker_platform().context("failed to install docker platform")?;
67            status.docker = true;
68        }
69    }
70
71    // Check Dev Containers CLI
72    match Command::new("devcontainer").arg("--version").output() {
73        Ok(output) if output.status.success() => {
74            println!("Dev Containers CLI is installed: {}", String::from_utf8_lossy(&output.stdout));
75            status.devcontainers = true;
76        },
77        _ => {
78            println!("Installing Dev Containers CLI...");
79            install_devcontainers().context("Failed to install dev container")?;
80            status.devcontainers = true;
81        }
82    }
83
84    Ok(status)
85}