use anyhow::Result;
use std::path::PathBuf;
use crate::{ci_patcher, commands::generate::Generate};
#[derive(Debug, clap::Args)]
pub struct Init {
#[arg(long)]
pub binary: String,
#[arg(long = "namespace", required = true)]
pub namespaces: Vec<String>,
#[arg(long)]
pub build_workflow: String,
#[arg(long)]
pub release_workflow: String,
#[arg(long)]
pub requires_job: Option<String>,
#[arg(long)]
pub release_after_job: Option<String>,
#[arg(long, default_value = "orb")]
pub orb_dir: String,
#[arg(long, default_value = ".circleci")]
pub ci_dir: PathBuf,
#[arg(long, default_value = "12.3.3")]
pub orb_tools_version: String,
#[arg(long, default_value = "3.2.0")]
pub docker_orb_version: String,
#[arg(long, default_value = "docker-credentials")]
pub docker_context: String,
#[arg(long, default_value = "orb-publishing")]
pub orb_context: String,
#[arg(long)]
pub mcp: bool,
#[arg(long)]
pub dry_run: bool,
}
impl Init {
pub fn run(&self) -> Result<()> {
let namespace = self.namespaces.first().cloned().unwrap_or_default();
tracing::info!("Generating orb source into ./{}", self.orb_dir);
let gen = Generate {
binary: self.binary.clone(),
namespaces: self.namespaces.clone(),
output: PathBuf::from("."),
orb_dir: self.orb_dir.clone(),
install_method: crate::commands::generate::InstallMethod::Binstall,
base_image: "ubuntu:24.04".to_string(),
home_url: None,
source_url: None,
dry_run: self.dry_run,
};
gen.run()?;
let opts = ci_patcher::PatchOpts {
binary: self.binary.clone(),
namespace,
orb_dir: self.orb_dir.clone(),
build_workflow: self.build_workflow.clone(),
release_workflow: self.release_workflow.clone(),
requires_job: self.requires_job.clone(),
release_after_job: self.release_after_job.clone(),
orb_tools_version: self.orb_tools_version.clone(),
docker_orb_version: self.docker_orb_version.clone(),
docker_context: self.docker_context.clone(),
orb_context: self.orb_context.clone(),
mcp: self.mcp,
};
let summary = ci_patcher::apply_patches(&self.ci_dir, &opts, self.dry_run)?;
for line in &summary {
println!("{line}");
}
if self.dry_run {
println!("(dry-run: no files written)");
} else {
println!("Done.");
}
Ok(())
}
}