aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-php-rpc/php/stubs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-05 03:58:03 +0900
committernsfisis <nsfisis@gmail.com>2026-08-05 03:58:03 +0900
commit9b444a9a879b75a6af3d3c7ba8b9a4294574c3ec (patch)
treeb1041b55bc3ed36a391370cc2f5ececc8cb386b2 /crates/shirabe-php-rpc/php/stubs
parentbe3458128ef09b3d1074b134f2822162e077e165 (diff)
downloadphp-shirabe-9b444a9a879b75a6af3d3c7ba8b9a4294574c3ec.tar.gz
php-shirabe-9b444a9a879b75a6af3d3c7ba8b9a4294574c3ec.tar.zst
php-shirabe-9b444a9a879b75a6af3d3c7ba8b9a4294574c3ec.zip
feat(plugin): run plugin-provided commands in a worker-side application
A same-FQCN Composer\Console\Application, hand-written under the new php/runtime/ tree, hosts CommandProvider commands inside the PHP worker: PhpCommandProxy overrides run() and forwards the stringified input, so the real Symfony machinery binds, validates and executes against the live command object, while help/list render Rust-side from a definition read back at construction. Reverse \Shirabe\RustCommandStub rows let a plugin command invoke built-in commands back in the Rust process, keeping every command on the side whose helper set it was written for. Composer\EventDispatcher\Event moves from a generated stub to a dual-mode runtime class: the real BaseCommand::initialize constructs a PreCommandRunEvent natively in the worker, which a proxy-only constructor guard rejected. Its PRE_COMMAND_RUN dispatch reaches a new EventDispatcher stub whose dispatch supports the observably-no-op no-listener case and fails explicitly otherwise. The stub generator now accepts runtime-provided classes as stub bases (never as targets) and cross-checks the Application handoff property table against the real class. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-php-rpc/php/stubs')
-rw-r--r--crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/Event.php67
-rw-r--r--crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/EventDispatcher.php92
2 files changed, 92 insertions, 67 deletions
diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/Event.php b/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/Event.php
deleted file mode 100644
index fea84c75..00000000
--- a/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/Event.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-// Generated by scripts/plugin-stub-generator; do not edit by hand.
-// Proxy stub for Composer\EventDispatcher\Event: the public surface forwards to the Rust-side entity over RPC.
-
-namespace Composer\EventDispatcher;
-
-class Event implements \ShirabeRustStub
-{
- /** @var int */
- protected $__rhandle;
- /** @var int */
- protected $__epoch;
-
- public function __construct(int $rhandle = 0, int $epoch = 0)
- {
- if (func_num_args() < 2) {
- // Constructing the class from plugin code (a common idiom for e.g. `new BufferIO()`)
- // is an open question of the plugin design; only proxy instantiation passes a
- // Rust handle. Fail with a diagnosable message instead of an ArgumentCountError.
- throw new \RuntimeException(
- 'Shirabe does not support constructing ' . static::class . ' inside the plugin process yet'
- );
- }
- $this->__rhandle = $rhandle;
- $this->__epoch = $epoch;
- }
-
- public function __destruct()
- {
- \ShirabeRustObjectRegistry::release($this->__rhandle);
- }
-
- public function __shirabeRustHandleDescriptor(): array
- {
- return [
- '__rhandle' => $this->__rhandle,
- '__class' => static::class,
- '__epoch' => $this->__epoch,
- ];
- }
-
- public function getName(): string
- {
- return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getName', []);
- }
-
- public function getArguments(): array
- {
- return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getArguments', []);
- }
-
- public function getFlags(): array
- {
- return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getFlags', []);
- }
-
- public function isPropagationStopped(): bool
- {
- return \ShirabeRpcRuntime::callRust($this->__rhandle, 'isPropagationStopped', []);
- }
-
- public function stopPropagation(): void
- {
- \ShirabeRpcRuntime::callRust($this->__rhandle, 'stopPropagation', []);
- }
-}
diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/EventDispatcher.php b/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/EventDispatcher.php
new file mode 100644
index 00000000..c0651081
--- /dev/null
+++ b/crates/shirabe-php-rpc/php/stubs/Composer/EventDispatcher/EventDispatcher.php
@@ -0,0 +1,92 @@
+<?php
+
+// Generated by scripts/plugin-stub-generator; do not edit by hand.
+// Proxy stub for Composer\EventDispatcher\EventDispatcher: the public surface forwards to the Rust-side entity over RPC.
+
+namespace Composer\EventDispatcher;
+
+use Composer\DependencyResolver\Transaction;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\Repository\RepositoryInterface;
+
+class EventDispatcher implements \ShirabeRustStub
+{
+ /** @var int */
+ protected $__rhandle;
+ /** @var int */
+ protected $__epoch;
+
+ public function __construct(int $rhandle = 0, int $epoch = 0)
+ {
+ if (func_num_args() < 2) {
+ // Constructing the class from plugin code (a common idiom for e.g. `new BufferIO()`)
+ // is an open question of the plugin design; only proxy instantiation passes a
+ // Rust handle. Fail with a diagnosable message instead of an ArgumentCountError.
+ throw new \RuntimeException(
+ 'Shirabe does not support constructing ' . static::class . ' inside the plugin process yet'
+ );
+ }
+ $this->__rhandle = $rhandle;
+ $this->__epoch = $epoch;
+ }
+
+ public function __destruct()
+ {
+ \ShirabeRustObjectRegistry::release($this->__rhandle);
+ }
+
+ public function __shirabeRustHandleDescriptor(): array
+ {
+ return [
+ '__rhandle' => $this->__rhandle,
+ '__class' => static::class,
+ '__epoch' => $this->__epoch,
+ ];
+ }
+
+ public function setRunScripts(bool $runScripts = true): self
+ {
+ \ShirabeRpcRuntime::callRust($this->__rhandle, 'setRunScripts', [$runScripts]);
+ return $this;
+ }
+
+ public function dispatch(?string $eventName, ?Event $event = null): int
+ {
+ return \ShirabeRpcRuntime::callRust($this->__rhandle, 'dispatch', [$eventName, $event]);
+ }
+
+ public function dispatchScript(string $eventName, bool $devMode = false, array $additionalArgs = [], array $flags = []): int
+ {
+ return \ShirabeRpcRuntime::callRust($this->__rhandle, 'dispatchScript', [$eventName, $devMode, $additionalArgs, $flags]);
+ }
+
+ public function dispatchPackageEvent(string $eventName, bool $devMode, RepositoryInterface $localRepo, array $operations, OperationInterface $operation): int
+ {
+ return \ShirabeRpcRuntime::callRust($this->__rhandle, 'dispatchPackageEvent', [$eventName, $devMode, $localRepo, $operations, $operation]);
+ }
+
+ public function dispatchInstallerEvent(string $eventName, bool $devMode, bool $executeOperations, Transaction $transaction): int
+ {
+ return \ShirabeRpcRuntime::callRust($this->__rhandle, 'dispatchInstallerEvent', [$eventName, $devMode, $executeOperations, $transaction]);
+ }
+
+ public function addListener(string $eventName, $listener, int $priority = 0): void
+ {
+ \ShirabeRpcRuntime::callRust($this->__rhandle, 'addListener', [$eventName, $listener, $priority]);
+ }
+
+ public function removeListener($listener): void
+ {
+ \ShirabeRpcRuntime::callRust($this->__rhandle, 'removeListener', [$listener]);
+ }
+
+ public function addSubscriber(EventSubscriberInterface $subscriber): void
+ {
+ \ShirabeRpcRuntime::callRust($this->__rhandle, 'addSubscriber', [$subscriber]);
+ }
+
+ public function hasEventListeners(Event $event): bool
+ {
+ return \ShirabeRpcRuntime::callRust($this->__rhandle, 'hasEventListeners', [$event]);
+ }
+}