
Fix a bug where a GPUI macro still used `ModelContext` Rename `AsyncAppContext` -> `AsyncApp` Rename update_model, read_model, insert_model, and reserve_model to update_entity, read_entity, insert_entity, and reserve_entity Release Notes: - N/A
61 lines
2 KiB
Rust
61 lines
2 KiB
Rust
use std::sync::Arc;
|
|
|
|
use anyhow::Result;
|
|
use collections::HashMap;
|
|
use gpui::{App, AppContext as _, AsyncApp, Entity, Global, ReadGlobal, Task};
|
|
use project::Project;
|
|
|
|
use crate::ServerCommand;
|
|
|
|
pub type ContextServerFactory =
|
|
Arc<dyn Fn(Entity<Project>, &AsyncApp) -> Task<Result<ServerCommand>> + Send + Sync + 'static>;
|
|
|
|
struct GlobalContextServerFactoryRegistry(Entity<ContextServerFactoryRegistry>);
|
|
|
|
impl Global for GlobalContextServerFactoryRegistry {}
|
|
|
|
#[derive(Default)]
|
|
pub struct ContextServerFactoryRegistry {
|
|
context_servers: HashMap<Arc<str>, ContextServerFactory>,
|
|
}
|
|
|
|
impl ContextServerFactoryRegistry {
|
|
/// Returns the global [`ContextServerFactoryRegistry`].
|
|
pub fn global(cx: &App) -> Entity<Self> {
|
|
GlobalContextServerFactoryRegistry::global(cx).0.clone()
|
|
}
|
|
|
|
/// Returns the global [`ContextServerFactoryRegistry`].
|
|
///
|
|
/// Inserts a default [`ContextServerFactoryRegistry`] if one does not yet exist.
|
|
pub fn default_global(cx: &mut App) -> Entity<Self> {
|
|
if !cx.has_global::<GlobalContextServerFactoryRegistry>() {
|
|
let registry = cx.new(|_| Self::new());
|
|
cx.set_global(GlobalContextServerFactoryRegistry(registry));
|
|
}
|
|
cx.global::<GlobalContextServerFactoryRegistry>().0.clone()
|
|
}
|
|
|
|
pub fn new() -> Self {
|
|
Self {
|
|
context_servers: HashMap::default(),
|
|
}
|
|
}
|
|
|
|
pub fn context_server_factories(&self) -> Vec<(Arc<str>, ContextServerFactory)> {
|
|
self.context_servers
|
|
.iter()
|
|
.map(|(id, factory)| (id.clone(), factory.clone()))
|
|
.collect()
|
|
}
|
|
|
|
/// Registers the provided [`ContextServerFactory`].
|
|
pub fn register_server_factory(&mut self, id: Arc<str>, factory: ContextServerFactory) {
|
|
self.context_servers.insert(id, factory);
|
|
}
|
|
|
|
/// Unregisters the [`ContextServerFactory`] for the server with the given ID.
|
|
pub fn unregister_server_factory_by_id(&mut self, server_id: &str) {
|
|
self.context_servers.remove(server_id);
|
|
}
|
|
}
|