Skip to main content

cargo_mate/captain/
version_commands.rs

1use 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}