use super::Recipe;
use crate::cli::Delete;
use crate::fs_wrappers;
use crate::mkdev_error::Context;
use crate::mkdev_error::Error;
use crate::warning;
use std::collections::HashMap;
use std::path::PathBuf;
use rust_i18n::t;
pub fn delete_recipe(args: Delete, user_recipes: HashMap<String, Recipe>) -> Result<(), Error> {
if args.namespace {
return delete_namespace(&user_recipes, &args.recipe);
}
let to_delete = Recipe::pick(&user_recipes, &args.recipe)?;
let deleted_file = to_delete.delete()?;
println!(
"{}",
t!("recipes.delete_msg", path => &deleted_file.display())
);
Ok(())
}
fn delete_namespace(user_recipes: &HashMap<String, Recipe>, name: &str) -> Result<(), Error> {
user_recipes
.values()
.filter(|&r| matches!(r.namespace(), Some(ns) if ns == name))
.try_for_each(|r| {
let deleted_file = r.delete()?;
println!(
"{}",
t!("recipes.delete_msg", path => &deleted_file.display())
);
Ok(())
})
}
impl Recipe {
pub fn delete(&self) -> Result<PathBuf, Error> {
let recipe_file = self.dwelling()?;
if self.is_external()? {
warning!("{}", t!("recipes.external"));
}
fs_wrappers::remove_file(&recipe_file, Context::Delete)?;
Ok(recipe_file)
}
}