From f411daceacad66e0bd774fda7d3c5ef8533cc55c Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 26 May 2026 20:04:02 +0900 Subject: refactor(io): share IOInterface via Rc> handle Co-Authored-By: Claude Opus 4.7 --- crates/shirabe/src/command/archive_command.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'crates/shirabe/src/command/archive_command.rs') diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs index 1b21242..225b092 100644 --- a/crates/shirabe/src/command/archive_command.rs +++ b/crates/shirabe/src/command/archive_command.rs @@ -14,6 +14,7 @@ use crate::console::input::InputArgument; use crate::console::input::InputOption; use crate::factory::Factory; use crate::io::IOInterface; +use crate::io::IOInterfaceImmutable; use crate::package::archiver::ArchiveManager; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; @@ -111,9 +112,9 @@ impl ArchiveCommand { }); // TODO(phase-b): clone_box to release self borrow held by get_io. - let mut io_box = self.get_io().clone_box(); + let io_box = self.get_io().clone(); let return_code = self.archive( - io_box.as_mut(), + io_box.clone(), &config, input .get_argument("package") @@ -153,7 +154,7 @@ impl ArchiveCommand { pub fn archive( &mut self, - io: &mut dyn IOInterface, + io: std::rc::Rc>, config: &std::rc::Rc>, package_name: Option, version: Option, @@ -173,12 +174,17 @@ impl ArchiveCommand { &composer_archive_manager_ref } else { let factory = Factory; - let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(()))); + let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(None))); let http_downloader = std::rc::Rc::new(std::cell::RefCell::new( - Factory::create_http_downloader(io, config, indexmap::IndexMap::new())?, + Factory::create_http_downloader(io.clone(), config, indexmap::IndexMap::new())?, )); - let download_manager = - factory.create_download_manager(io, config, &http_downloader, &process, None)?; + let download_manager = factory.create_download_manager( + io.clone(), + config, + &http_downloader, + &process, + None, + )?; let loop_ = std::rc::Rc::new(std::cell::RefCell::new(Loop::new( http_downloader.clone(), Some(process), @@ -190,7 +196,7 @@ impl ArchiveCommand { let package: crate::package::CompletePackageInterfaceHandle = if let Some(name) = package_name { - match self.select_package(io, &name, version.as_deref())? { + match self.select_package(io.clone(), &name, version.as_deref())? { Some(p) => p, None => return Ok(1), } @@ -227,7 +233,7 @@ impl ArchiveCommand { pub fn select_package( &mut self, - io: &mut dyn IOInterface, + io: std::rc::Rc>, package_name: &str, version: Option<&str>, ) -> Result> { @@ -253,7 +259,7 @@ impl ArchiveCommand { repo = CompositeRepository::new(repos); min_stability = composer.get_package().get_minimum_stability().to_string(); } else { - let default_repos = RepositoryFactory::default_repos_with_default_manager(io)?; + let default_repos = RepositoryFactory::default_repos_with_default_manager(io.clone())?; let repo_names: Vec = default_repos.keys().cloned().collect(); io.write_error(&format!( "No composer.json found in the current directory, searching packages from {}", -- cgit v1.3.1