git_x/adapters/
cli_handlers.rs1use 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
9pub struct BranchCliHandler {
11 branch_manager: BranchManager,
12 formatter: BranchFormatter,
13}
14
15impl BranchCliHandler {
16 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 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, };
35
36 let result = self.branch_manager.create_branch(request)?;
37 Ok(self.formatter.format_creation_result(&result))
38 }
39
40 pub fn handle_clean_branches(&self, dry_run: bool) -> Result<String> {
42 let request = CleanBranchesRequest {
43 dry_run,
44 confirm_deletion: !dry_run, };
46
47 let result = self.branch_manager.clean_merged_branches(request)?;
48 Ok(self.formatter.format_clean_result(&result))
49 }
50
51 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 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
88pub struct RepositoryCliHandler {
90 repository: GitRepository,
91 formatter: RepositoryFormatter,
92}
93
94impl RepositoryCliHandler {
95 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 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 pub fn handle_health(&self) -> Result<String> {
114 let health = self.repository.health()?;
115 Ok(self.formatter.format_health_status(&health))
116 }
117}
118
119pub struct CliHandlerFactory;
121
122impl CliHandlerFactory {
123 pub fn create_branch_handler() -> Result<BranchCliHandler> {
125 BranchCliHandler::new()
126 }
127
128 pub fn create_repository_handler() -> Result<RepositoryCliHandler> {
130 RepositoryCliHandler::new()
131 }
132}