aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/plugin/plugin_interface.rs
blob: 586fb43b5ec7addeeba023efee4ef343173ab1a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! ref: composer/src/Composer/Plugin/PluginInterface.php

use crate::composer::ComposerHandle;
use crate::event_dispatcher::EventSubscriberInterface;
use crate::io::IOInterface;
use crate::plugin::Capable;

pub const PLUGIN_API_VERSION: &str = "2.9.0";

pub trait PluginInterface: std::fmt::Debug {
    // The PHP methods return void but may throw; the owned `ComposerHandle` follows the shared
    // handle policy — plugins typically store `$composer` beyond the call.
    fn activate(
        &mut self,
        composer: ComposerHandle,
        io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
    ) -> anyhow::Result<()>;

    fn deactivate(
        &mut self,
        composer: ComposerHandle,
        io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
    ) -> anyhow::Result<()>;

    fn uninstall(
        &mut self,
        composer: ComposerHandle,
        io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
    ) -> anyhow::Result<()>;

    /// PHP: `get_class($plugin)`. Rust has no runtime class name, so each implementor carries
    /// the name PHP would report.
    fn get_class_name(&self) -> String;

    // PHP-side `instanceof EventSubscriberInterface` / `instanceof Capable` checks map to
    // these downcast accessors.
    fn as_event_subscriber(&self) -> Option<&dyn EventSubscriberInterface> {
        None
    }

    fn as_capable(&self) -> Option<&dyn Capable> {
        None
    }

    /// For testing only: recovers the PHP-backed proxy so tests can read plugin properties the
    /// way PHPUnit asserts `$plugins[0]->version`.
    fn __as_php_plugin_proxy(&self) -> Option<&crate::plugin::PhpPluginProxy> {
        None
    }
}