git_x/adapters/
cli_handlers.rs

1use crate::adapters::formatters::*;
2use crate::core::interactive::Interactive;
3use crate::domain::{
4    BranchManager, CleanBranchesRequest, CreateBranchRequest, GitRepository, RecentBranchesRequest,
5    SwitchBranchRequest,
6};
7use crate::{GitXError, Result};
8
9/// CLI handler for branch operations
10pub struct BranchCliHandler {
11    branch_manager: BranchManager,
12    formatter: BranchFormatter,
13}
14
15impl BranchCliHandler {
16    /// Create a new CLI handler
17    pub fn new() -> Result<Self> {
18        let repository = GitRepository::open()?;
19        let branch_manager = BranchManager::new(repository);
20        let formatter = BranchFormatter::new();
21
22        Ok(Self {
23            branch_manager,
24            formatter,
25        })
26    }
27
28    /// Handle new branch creation command
29    pub fn handle_new_branch(&self, name: String, from: Option<String>) -> Result<String> {
30        let request = CreateBranchRequest {
31            name,
32            from,
33            create_backup: false, // CLI doesn't expose this option by default
34        };
35
36        let result = self.branch_manager.create_branch(request)?;
37        Ok(self.formatter.format_creation_result(&result))
38    }
39
40    /// Handle clean branches command
41    pub fn handle_clean_branches(&self, dry_run: bool) -> Result<String> {
42        let request = CleanBranchesRequest {
43            dry_run,
44            confirm_deletion: !dry_run, // Only confirm for actual deletions
45        };
46
47        let result = self.branch_manager.clean_merged_branches(request)?;
48        Ok(self.formatter.format_clean_result(&result))
49    }
50
51    /// Handle switch recent command
52    pub fn handle_switch_recent(&self) -> Result<String> {
53        let recent_request = RecentBranchesRequest {
54            limit: Some(10),
55            exclude_current: true,
56            exclude_protected: false,
57        };
58
59        let recent_result = self.branch_manager.get_recent_branches(recent_request)?;
60
61        if recent_result.branches.is_empty() {
62            return Err(GitXError::GitCommand(
63                "No recent branches found".to_string(),
64            ));
65        }
66
67        let selected_branch = if Interactive::is_interactive() {
68            Interactive::branch_picker(
69                &recent_result.branches,
70                Some("Select a recent branch to switch to"),
71            )?
72        } else {
73            // In non-interactive mode, just switch to the most recent branch
74            recent_result.branches[0].clone()
75        };
76
77        let switch_request = SwitchBranchRequest {
78            branch_name: selected_branch.clone(),
79            strict_mode: false,
80            create_checkpoint: false,
81        };
82
83        let switch_result = self.branch_manager.switch_branch(switch_request)?;
84        Ok(self.formatter.format_switch_result(&switch_result))
85    }
86}
87
88/// CLI handler for repository operations
89pub struct RepositoryCliHandler {
90    repository: GitRepository,
91    formatter: RepositoryFormatter,
92}
93
94impl RepositoryCliHandler {
95    /// Create a new CLI handler
96    pub fn new() -> Result<Self> {
97        let repository = GitRepository::open()?;
98        let formatter = RepositoryFormatter::new();
99
100        Ok(Self {
101            repository,
102            formatter,
103        })
104    }
105
106    /// Handle info command
107    pub fn handle_info(&self, detailed: bool) -> Result<String> {
108        let info = self.repository.info()?;
109        Ok(self.formatter.format_repository_info(&info, detailed))
110    }
111
112    /// Handle health command
113    pub fn handle_health(&self) -> Result<String> {
114        let health = self.repository.health()?;
115        Ok(self.formatter.format_health_status(&health))
116    }
117}
118
119/// Factory for creating CLI handlers
120pub struct CliHandlerFactory;
121
122impl CliHandlerFactory {
123    /// Create a branch CLI handler
124    pub fn create_branch_handler() -> Result<BranchCliHandler> {
125        BranchCliHandler::new()
126    }
127
128    /// Create a repository CLI handler
129    pub fn create_repository_handler() -> Result<RepositoryCliHandler> {
130        RepositoryCliHandler::new()
131    }
132}