use std::path::{Path, PathBuf};
use clap::Parser;
use repograph_core::{Config, RepoEdit, RepographError, validate_git_repo};
use crate::output::{self, Mutation, RepoConfirmation};
#[derive(Debug, Parser)]
pub struct Args {
pub name: String,
#[arg(long = "name")]
pub new_name: Option<String>,
#[arg(long)]
pub description: Option<String>,
#[arg(long, value_delimiter = ',')]
pub stack: Option<Vec<String>>,
#[arg(long)]
pub path: Option<PathBuf>,
#[arg(long)]
pub json: bool,
}
#[tracing::instrument(skip(args), fields(
name = %args.name,
config_dir = %config_dir.display(),
))]
pub fn run(args: Args, config_dir: &Path) -> Result<(), RepographError> {
tracing::debug!("edit: start");
let new_name = args.new_name.filter(|s| !s.is_empty());
let description = args.description.map(|s| (!s.is_empty()).then_some(s));
let stack = args
.stack
.map(|tags| tags.into_iter().filter(|s| !s.is_empty()).collect());
if new_name.is_none() && description.is_none() && stack.is_none() && args.path.is_none() {
return Err(RepographError::UsageError(
"edit requires at least one of --name, --description, --stack, --path".to_string(),
));
}
let path = match &args.path {
Some(p) => Some(validate_git_repo(p)?),
None => None,
};
let edit = RepoEdit {
new_name,
description,
stack,
path,
};
let mut config = Config::load(config_dir)?;
let (name, _repo) = config.edit_repo(&args.name, edit)?;
config.save(config_dir)?;
tracing::info!(repo = %name, "edited");
if args.json {
if let Some(repo) = config.repos().get(&name) {
output::render_mutation(&Mutation::Edit {
repo: RepoConfirmation::new(&name, repo),
})?;
}
}
Ok(())
}