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/event_dispatcher/event_dispatcher.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'crates/shirabe/src/event_dispatcher/event_dispatcher.rs') diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs index ae86fcf..3a037c9 100644 --- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs +++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs @@ -31,6 +31,7 @@ use crate::installer::InstallerEvent; use crate::installer::PackageEvent; use crate::io::ConsoleIO; use crate::io::IOInterface; +use crate::io::IOInterfaceImmutable; use crate::plugin::CommandEvent; use crate::plugin::PreCommandRunEvent; use crate::repository::RepositoryInterface; @@ -62,7 +63,7 @@ pub enum Callable { #[derive(Debug)] pub struct EventDispatcher { pub(crate) composer: PartialComposerWeakHandle, - pub(crate) io: Box, + pub(crate) io: std::rc::Rc>, pub(crate) loader: Option, pub(crate) process: std::rc::Rc>, pub(crate) listeners: IndexMap>>, @@ -76,11 +77,13 @@ pub struct EventDispatcher { impl EventDispatcher { pub fn new( composer: PartialComposerWeakHandle, - io: Box, + io: std::rc::Rc>, process: Option>>, ) -> Self { let process = process.unwrap_or_else(|| { - std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(&*io))) + std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(Some( + io.clone(), + )))) }); let event_stack: Vec = Vec::new(); let skip_scripts_env = @@ -609,7 +612,8 @@ impl EventDispatcher { // TODO(phase-b): IOInterface needs an `as_any` shim before // `instanceof ConsoleIO` can be expressed; treat io as a // generic IOInterface for now. - let _io_ref: &dyn IOInterface = &*self.io; + let _io_ref_guard = self.io.borrow(); + let _io_ref: &dyn IOInterface = &*_io_ref_guard; let downcast: Option<&ConsoleIO> = None; let output: ConsoleOutput = if let Some(_console_io) = downcast { // TODO(plugin): \ReflectionProperty to read private `output` from ConsoleIO @@ -1311,9 +1315,9 @@ impl EventDispatcher { // ---- helpers ---- - fn io_clone(&self) -> Box { + fn io_clone(&self) -> std::rc::Rc> { // TODO(phase-b): IOInterface is not Clone — placeholder until io ownership is resolved. - todo!("clone Box") + todo!("clone std::rc::Rc>") } fn composer(&self) -> PartialComposerHandle { -- cgit v1.3.1