From cd25c3e193f05a5e89bca2a1c706c85fdc9c9155 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 6 Jun 2026 02:13:59 +0900 Subject: refactor(repository): make read methods fallible and take &mut self Change RepositoryInterface and WritableRepositoryInterface read methods (find_package, find_packages, get_packages, load_packages, search, get_providers, get_canonical_packages) to take &mut self and return anyhow::Result, so lazy-loading repositories such as ComposerRepository can perform fallible I/O and mutate internal state on access. Update all implementors and call sites to propagate the Result and pass mutable references. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../shirabe/src/event_dispatcher/event_dispatcher.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'crates/shirabe/src/event_dispatcher') diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs index ea0d69a..7122a4b 100644 --- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs +++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs @@ -308,7 +308,7 @@ impl EventDispatcher { if !is_string_callable { // TODO(plugin): non-string callable handling — verify is_callable, invoke, // and replicate the get_class / write_error / is_callable error path from PHP. - self.make_autoloader(event, &callable); + let _ = self.make_autoloader(event, &callable); if !is_callable(&PhpMixed::Null) { let (class_name, method) = match &callable { Callable::ArrayCallable(first, m) => { @@ -504,7 +504,8 @@ impl EventDispatcher { let class_name = substr(callable_str, 0, Some(pos)); let method_name = substr(callable_str, pos + 2, None); - self.make_autoloader(event, &Callable::String(callable_str.clone())); + let _ = + self.make_autoloader(event, &Callable::String(callable_str.clone())); if !class_exists(&class_name) { self.io.write_error3(&format!( "Class {} is not autoloadable, can not call {} script", @@ -550,7 +551,7 @@ impl EventDispatcher { Callable::String(ref callable_str) if self.is_command_class(callable_str) => { let class_name = callable_str.clone(); - self.make_autoloader( + let _ = self.make_autoloader( event, &Callable::ArrayCallable( Box::new(PhpMixed::String(callable_str.clone())), @@ -1223,11 +1224,11 @@ impl EventDispatcher { "unsupported".to_string() } - fn make_autoloader(&mut self, event: &Event, callable: &Callable) { + fn make_autoloader(&mut self, event: &Event, callable: &Callable) -> anyhow::Result<()> { let composer = self.composer(); // TODO(plugin): full autoloader rebuild on plugin-supplied callables — currently a stub. let Some(composer) = composer.as_full() else { - return; + return Ok(()); }; let composer = composer.borrow_mut(); @@ -1244,7 +1245,7 @@ impl EventDispatcher { Callable::Closure => "closure".to_string(), }; if self.previous_listeners.contains_key(&callable_key) { - return; + return Ok(()); } self.previous_listeners.insert(callable_key, true); @@ -1253,7 +1254,7 @@ impl EventDispatcher { .get_repository_manager() .borrow() .get_local_repository() - .get_canonical_packages(); + .get_canonical_packages()?; let generator = composer.get_autoload_generator().clone(); let generator = generator.borrow(); let mut hash_input = packages @@ -1269,7 +1270,7 @@ impl EventDispatcher { let hash_value = hash("sha256", &hash_input); if self.previous_hash.as_deref() == Some(hash_value.as_str()) { - return; + return Ok(()); } self.previous_hash = Some(hash_value); @@ -1302,6 +1303,7 @@ impl EventDispatcher { let mut loader = generator.create_loader(&map, Some(vendor_dir.clone())); loader.register(false); self.loader = Some(loader); + Ok(()) } // ---- helpers ---- -- cgit v1.3.1