cargo_mate/captain/
version_commands.rs1use anyhow::Result;
2use colored::*;
3use clap::Subcommand;
4use crate::version::{VersionManager, IncrementPolicy};
5#[derive(Subcommand, Debug)]
6pub enum VersionAction {
7 Init {
8 #[arg(help = "Initial version number (e.g., 1.0.0)")]
9 version: Option<String>,
10 },
11 Info,
12 Increment {
13 #[arg(help = "Increment type")]
14 #[arg(value_enum)]
15 #[arg(default_value = "patch")]
16 increment_type: IncrementType,
17 },
18 Set { #[arg(help = "New version number")] version: String },
19 History,
20 UpdateCargo,
21 Config { #[command(subcommand)] action: VersionConfigAction },
22}
23#[derive(Subcommand, Debug, Clone, clap::ValueEnum)]
24pub enum IncrementType {
25 Patch,
26 Minor,
27 Major,
28}
29#[derive(Subcommand, Debug)]
30pub enum VersionConfigAction {
31 Enable,
32 Disable,
33 Policy { #[arg(value_enum)] policy: IncrementType },
34 Show,
35}
36pub fn handle_version(action: VersionAction) -> Result<()> {
37 match action {
38 VersionAction::Init { version } => {
39 let mut manager = VersionManager::new(None)?;
40 manager.init(version)?;
41 }
42 VersionAction::Info => {
43 let manager = VersionManager::new(None)?;
44 manager.show_info();
45 }
46 VersionAction::Increment { increment_type } => {
47 let mut manager = VersionManager::new(None)?;
48 let new_version = match increment_type {
49 IncrementType::Patch => manager.increment()?,
50 IncrementType::Minor => {
51 let original_policy = manager.config.increment_policy.clone();
52 manager.config.increment_policy = IncrementPolicy::Minor;
53 let result = manager.increment()?;
54 manager.config.increment_policy = original_policy;
55 result
56 }
57 IncrementType::Major => {
58 let original_policy = manager.config.increment_policy.clone();
59 manager.config.increment_policy = IncrementPolicy::Major;
60 let result = manager.increment()?;
61 manager.config.increment_policy = original_policy;
62 result
63 }
64 };
65 println!("✅ Version incremented to: {}", new_version.cyan());
66 }
67 VersionAction::Set { version } => {
68 let mut manager = VersionManager::new(None)?;
69 manager.set_version(&version)?;
70 }
71 VersionAction::History => {
72 println!("📚 Version history feature coming soon!");
73 println!("For now, check the .v file for version changes.");
74 }
75 VersionAction::UpdateCargo => {
76 let manager = VersionManager::new(None)?;
77 manager.update_cargo_toml()?;
78 }
79 VersionAction::Config { action } => {
80 match action {
81 VersionConfigAction::Enable => {
82 let mut manager = VersionManager::new(None)?;
83 manager.config.auto_increment = true;
84 manager.save_config()?;
85 println!("✅ Auto-increment enabled");
86 }
87 VersionConfigAction::Disable => {
88 let mut manager = VersionManager::new(None)?;
89 manager.config.auto_increment = false;
90 manager.save_config()?;
91 println!("✅ Auto-increment disabled");
92 }
93 VersionConfigAction::Policy { policy } => {
94 let mut manager = VersionManager::new(None)?;
95 manager.config.increment_policy = match policy {
96 IncrementType::Patch => IncrementPolicy::Patch,
97 IncrementType::Minor => IncrementPolicy::Minor,
98 IncrementType::Major => IncrementPolicy::Major,
99 };
100 manager.save_config()?;
101 println!("✅ Increment policy updated");
102 }
103 VersionConfigAction::Show => {
104 let manager = VersionManager::new(None)?;
105 manager.show_info();
106 }
107 }
108 }
109 }
110 Ok(())
111}