diff --git a/src/error.rs b/src/error.rs index ed6a605..5e9bc08 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; #[derive(thiserror::Error, Debug)] pub enum HarmonicError { #[error("Error executing action")] - ActionError( + Action( #[source] #[from] Box, diff --git a/src/plan.rs b/src/plan.rs index a1aaee1..cbad9ea 100644 --- a/src/plan.rs +++ b/src/plan.rs @@ -90,7 +90,7 @@ impl InstallPlan { if let Err(err) = write_receipt(self.clone()).await { tracing::error!("Error saving receipt: {:?}", err); } - return Err(HarmonicError::ActionError(err)); + return Err(HarmonicError::Action(err)); } } @@ -156,7 +156,7 @@ impl InstallPlan { if let Err(err) = write_receipt(self.clone()).await { tracing::error!("Error saving receipt: {:?}", err); } - return Err(HarmonicError::ActionError(err)); + return Err(HarmonicError::Action(err)); } } diff --git a/src/planner/linux/multi.rs b/src/planner/linux/multi.rs index bcf3e67..e766129 100644 --- a/src/planner/linux/multi.rs +++ b/src/planner/linux/multi.rs @@ -6,7 +6,7 @@ use crate::{ planner::Planner, BuiltinPlanner, CommonSettings, InstallPlan, }; -use std::collections::HashMap; +use std::{collections::HashMap, path::Path}; #[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)] pub struct LinuxMulti { @@ -24,12 +24,29 @@ impl Planner for LinuxMulti { } async fn plan(self) -> Result> { + // If on NixOS, running `harmonic` is pointless + if Path::new("/etc/NIXOS").exists() { + return Err(Error::NixOs.into()); + } + Ok(InstallPlan { planner: Box::new(self.clone()), actions: vec![ - Box::new(CreateDirectory::plan("/nix", None, None, 0o0755, true).await?), - Box::new(ProvisionNix::plan(self.settings.clone()).await?), - Box::new(ConfigureNix::plan(self.settings).await?), + Box::new( + CreateDirectory::plan("/nix", None, None, 0o0755, true) + .await + .map_err(|v| Error::Action(v.into()))?, + ), + Box::new( + ProvisionNix::plan(self.settings.clone()) + .await + .map_err(|v| Error::Action(v.into()))?, + ), + Box::new( + ConfigureNix::plan(self.settings) + .await + .map_err(|v| Error::Action(v.into()))?, + ), ], }) } @@ -51,3 +68,15 @@ impl Into for LinuxMulti { BuiltinPlanner::LinuxMulti(self) } } + +#[derive(thiserror::Error, Debug)] +enum Error { + #[error("NixOS already has Nix installed")] + NixOs, + #[error("Error planning action")] + Action( + #[source] + #[from] + Box, + ), +}