omni_forge/image_builder/ensure/
mod.rs1use 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 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 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 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 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}