From 20f7a7826ae048d249e0d837ca6393a5f09c9ba6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 3 Aug 2026 01:30:26 +0900 Subject: feat(event-dispatcher): run composer.json PHP scripts through the RPC worker Implement the two script execution paths that previously stopped at todo!(): a Class::method listener is invoked as CallStaticMethod with the event crossing the boundary as a proxy-stub handle, and a Command-class listener runs inside a throwaway bare Symfony Application hosted by the worker via a generated snippet, its BufferedOutput written back through the dispatcher's IO. makeAutoloader is ported for real (canonical-package hash, setDevMode, buildPackageMap/parseAutoloads/createLoader), and the class_exists/is_callable/is_a/defined guards now query the worker, whose script autoloader resolves classes by asking the Rust-side ClassLoader over the reverse channel. EventInterface gains as_any (the IOInterface downcast pattern) so the concrete event type is reachable behind the trait object. Application::do_run now registers ScriptAliasCommand entries as typed commands, unblocking the run-script --list/alias tests; the dev-mode-to-generator test is ported with local mockall mocks. The remaining ignored tests carry re-verified reasons: the listener methods live on the PHPUnit test class itself (unloadable in the worker), or the test needs live import of a user PHP Command class into the Application. Co-Authored-By: Claude Fable 5 --- crates/shirabe/src/script/event.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'crates/shirabe/src/script') diff --git a/crates/shirabe/src/script/event.rs b/crates/shirabe/src/script/event.rs index 1b1e76dd..b17e77cf 100644 --- a/crates/shirabe/src/script/event.rs +++ b/crates/shirabe/src/script/event.rs @@ -75,6 +75,10 @@ impl Event { } impl EventInterface for Event { + fn as_any(&self) -> &dyn std::any::Any { + self + } + fn get_name(&self) -> &str { self.inner.get_name() } @@ -97,6 +101,10 @@ impl EventInterface for Event { } impl EventInterface for OriginatingEvent { + fn as_any(&self) -> &dyn std::any::Any { + self + } + fn get_name(&self) -> &str { match self { OriginatingEvent::Base(e) => e.get_name(), -- cgit v1.3.1