1use std::sync::Arc;
2
3use gpui::{App, AppContext as _, Context, Entity, EventEmitter, Global};
4
5use crate::ExtensionManifest;
6
7pub fn init(cx: &mut App) {
8 let extension_events = cx.new(ExtensionEvents::new);
9 cx.set_global(GlobalExtensionEvents(extension_events));
10}
11
12struct GlobalExtensionEvents(Entity<ExtensionEvents>);
13
14impl Global for GlobalExtensionEvents {}
15
16/// An event bus for broadcasting extension-related events throughout the app.
17pub struct ExtensionEvents;
18
19impl ExtensionEvents {
20 /// Returns the global [`ExtensionEvents`].
21 pub fn try_global(cx: &App) -> Option<Entity<Self>> {
22 cx.try_global::<GlobalExtensionEvents>()
23 .map(|g| g.0.clone())
24 }
25
26 const fn new(_cx: &mut Context<Self>) -> Self {
27 Self
28 }
29
30 pub fn emit(&mut self, event: Event, cx: &mut Context<Self>) {
31 cx.emit(event)
32 }
33}
34
35#[derive(Clone, Debug)]
36pub enum Event {
37 ExtensionInstalled(Arc<ExtensionManifest>),
38 ExtensionUninstalled(Arc<ExtensionManifest>),
39 ExtensionsInstalledChanged,
40 ConfigureExtensionRequested(Arc<ExtensionManifest>),
41}
42
43impl EventEmitter<Event> for ExtensionEvents {}