diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-26 20:04:02 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-26 20:04:02 +0900 |
| commit | f411daceacad66e0bd774fda7d3c5ef8533cc55c (patch) | |
| tree | eefb065e4d676a3f7031ca49bab21c773b00b134 /crates/shirabe/src/util/process_executor.rs | |
| parent | 1921f173ea219cb4b25847294d2d3fa465550fbb (diff) | |
| download | php-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.tar.gz php-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.tar.zst php-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.zip | |
refactor(io): share IOInterface via Rc<RefCell<dyn _>> handle
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/util/process_executor.rs')
| -rw-r--r-- | crates/shirabe/src/util/process_executor.rs | 51 |
1 files changed, 6 insertions, 45 deletions
diff --git a/crates/shirabe/src/util/process_executor.rs b/crates/shirabe/src/util/process_executor.rs index 74fc30c..36025ea 100644 --- a/crates/shirabe/src/util/process_executor.rs +++ b/crates/shirabe/src/util/process_executor.rs @@ -19,6 +19,7 @@ use shirabe_php_shim::{ }; use crate::io::IOInterface; +use crate::io::IOInterfaceImmutable; use crate::util::GitHub; use crate::util::Platform; @@ -34,7 +35,7 @@ pub struct ProcessExecutor { /// @var string pub(crate) error_output: String, /// @var ?IOInterface - pub(crate) io: Option<Box<dyn IOInterface>>, + pub(crate) io: Option<std::rc::Rc<std::cell::RefCell<dyn IOInterface>>>, /// @phpstan-var array<int, array<string, mixed>> jobs: IndexMap<i64, Job>, /// @var int @@ -87,11 +88,11 @@ impl ProcessExecutor { const GIT_CMDS_NEED_GIT_DIR: &'static [&'static [&'static str]] = &[&["show"], &["log"], &["branch"], &["remote", "set-url"]]; - pub fn new<I: IntoProcessExecutorIo>(io: I) -> Self { + pub fn new(io: Option<std::rc::Rc<std::cell::RefCell<dyn IOInterface>>>) -> Self { let mut this = Self { capture_output: false, error_output: String::new(), - io: io.into_process_executor_io(), + io, jobs: IndexMap::new(), running_jobs: 0, max_jobs: 10, @@ -270,7 +271,7 @@ impl ProcessExecutor { }) }; - let io_for_signal = self.io.as_ref().map(|b| &**b as *const dyn IOInterface); + let io_for_signal = self.io.clone(); let signal_handler = SignalHandler::create( vec![ SignalHandler::SIGINT.to_string(), @@ -278,8 +279,7 @@ impl ProcessExecutor { SignalHandler::SIGHUP.to_string(), ], Box::new(move |signal: String, _h: &SignalHandler| { - if let Some(io_ptr) = io_for_signal { - let io = unsafe { &*io_ptr }; + if let Some(io) = &io_for_signal { io.write_error(&format!( "Received {}, aborting when child process is done", signal @@ -1085,45 +1085,6 @@ impl ToTimeoutSeconds for PhpMixed { } } -/// Phase B helper: accept various IO forms for `ProcessExecutor::new`. -/// Note: clones the IO via `clone_box` for borrow forms; this is incidental -/// to Phase B — PHP class semantics should use Rc, but that requires broader -/// refactor. TODO(phase-b): switch to shared ownership when call sites are -/// stabilized. -pub trait IntoProcessExecutorIo { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>>; -} - -impl IntoProcessExecutorIo for Option<Box<dyn IOInterface>> { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>> { - self - } -} - -impl IntoProcessExecutorIo for Box<dyn IOInterface> { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>> { - Some(self) - } -} - -impl IntoProcessExecutorIo for () { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>> { - None - } -} - -impl IntoProcessExecutorIo for &dyn IOInterface { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>> { - Some(self.clone_box()) - } -} - -impl IntoProcessExecutorIo for &mut dyn IOInterface { - fn into_process_executor_io(self) -> Option<Box<dyn IOInterface>> { - Some(self.clone_box()) - } -} - // Suppress unused-import warnings. #[allow(dead_code)] const _USE_PARITY: () = { |
