use crate::group_maps::{convert_group_names_to_ids, get_group_maps};
use crate::util::{GetKeyfile, group_already_known, group_identifier_from_string, println_paint};
use clap::Parser;
use ironoxide::group::GroupName;
use ironoxide::prelude::{BlockingIronOxide, GroupId};
use itertools::Either;
use yansi::Paint;
use super::create::parse_group_name;
use std::path::PathBuf;
const EXAMPLE: &str = "EXAMPLE
$ ironhide group rename myGroup newGroup
";
#[derive(Parser)]
#[clap(after_help = EXAMPLE)]
pub struct Rename {
#[clap(value_parser = group_identifier_from_string)]
current_group_name: Either<GroupName, GroupId>,
#[clap(value_parser = parse_group_name)]
new_group_name: GroupName,
#[clap(value_parser = clap::value_parser!(PathBuf), short, long)]
keyfile: Option<PathBuf>,
}
impl GetKeyfile for Rename {
fn get_keyfile(&self) -> Option<&PathBuf> {
self.keyfile.as_ref()
}
}
pub fn group_rename(
sdk: &BlockingIronOxide,
Rename {
current_group_name,
new_group_name,
..
}: Rename,
) -> Result<(), String> {
if group_already_known(sdk, &new_group_name) {
println_paint(Paint::red(format!(
"You're already in a group with the name {}. Please pick a different name.",
new_group_name.name()
)));
} else if new_group_name.name().contains('^') || new_group_name.name().contains(',') {
println_paint(Paint::red(
"Group names cannot contain commas or carets.".to_string(),
));
} else {
let (groups_by_name, _) = get_group_maps(sdk);
match convert_group_names_to_ids(&[current_group_name], &groups_by_name).first() {
Some(group_id) => {
match sdk.group_update_name(group_id, Some(&new_group_name)) {
Ok(_) => {
println_paint(Paint::green("Group name successfully updated.".to_string()));
}
Err(err) => {
println_paint(Paint::red(format!("Group could not be updated: {}", err)));
}
};
}
None => {
println_paint(Paint::red("Group does not exist.".to_string()));
}
}
}
Ok(())
}