use std::process::{exit, Command};
pub enum ExecuteError {
CmdError,
WriteError(String),
}
pub fn envinstall(pkgs: Vec<String>) -> Result<(), ExecuteError> {
let mut prefixpkgs = vec![];
for p in &pkgs {
prefixpkgs.push(format!("nixos.{}", p));
}
match Command::new("nix-env").arg("-iA").args(prefixpkgs).status() {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn envremove(pkgs: Vec<String>) -> Result<(), ExecuteError> {
match Command::new("nix-env").arg("-e").args(pkgs).status() {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn envupdate() -> Result<(), ExecuteError> {
match Command::new("nix-env").arg("-u").arg("*").status() {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn pkwrite(
mut pkgs: Vec<String>,
f: &str,
query: Option<&str>,
) -> Result<String, ExecuteError> {
let q;
(pkgs, q) = pkwith(pkgs, f, query);
let out = match nix_editor::write::addtoarr(f, &q, pkgs) {
Ok(x) => x,
Err(_) => exit(1),
};
Ok(out)
}
pub fn pkrm(mut pkgs: Vec<String>, f: &str, query: Option<&str>) -> Result<String, ExecuteError> {
let q;
(pkgs, q) = pkwith(pkgs, f, query);
let out = match nix_editor::write::rmarr(f, &q, pkgs) {
Ok(x) => x,
Err(_) => exit(1),
};
Ok(out)
}
fn pkwith(mut pkgs: Vec<String>, f: &str, query: Option<&str>) -> (Vec<String>, String) {
let q = query.unwrap_or("environment.systemPackages");
if let Ok(s) = nix_editor::read::getwithvalue(f, q) {
if !s.contains(&"pkgs".to_string()) {
pkgs = pkgs
.into_iter()
.map(|x| format!("pkgs.{}", x))
.collect::<Vec<String>>();
}
}
(pkgs, q.to_string())
}
pub fn systemswitch() -> Result<(), ExecuteError> {
match Command::new("nixos-rebuild")
.arg("switch")
.arg("--use-remote-sudo")
.status()
{
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn systemflakeswitch(flakepath: &str) -> Result<(), ExecuteError> {
let status = Command::new("nixos-rebuild")
.arg("switch")
.arg("--flake")
.arg(flakepath)
.arg("--use-remote-sudo")
.status();
match status {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn homeswitch() -> Result<(), ExecuteError> {
let status = Command::new("home-manager").arg("switch").status();
match status {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn homeflakeswitch(flakepath: &str) -> Result<(), ExecuteError> {
let status = Command::new("home-manager")
.arg("switch")
.arg("--flake")
.arg(flakepath)
.status();
match status {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn updatechannel() -> Result<(), ExecuteError> {
match Command::new("nix-channel").arg("--update").status() {
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}
pub fn updateflake(flake: &str) -> Result<(), ExecuteError> {
match Command::new("nix")
.arg("flake")
.arg("update")
.arg(flake.split('#').collect::<Vec<&str>>()[0])
.status()
{
Ok(_) => Ok(()),
Err(_) => Err(ExecuteError::CmdError),
}
}