This removes around 900 unnecessary clones, ranging from cloning a few ints all the way to large data structures and images. A lot of these were fixed using `cargo clippy --fix --workspace --all-targets`, however it often breaks other lints and needs to be run again. This was then followed up with some manual fixing. I understand this is a large diff, but all the changes are pretty trivial. Rust is doing some heavy lifting here for us. Once I get it up to speed with main, I'd appreciate this getting merged rather sooner than later. Release Notes: - N/A
73 lines
2.2 KiB
Rust
73 lines
2.2 KiB
Rust
use std::sync::Arc;
|
|
|
|
use anyhow::Result;
|
|
use cloud_llm_client::WebSearchResponse;
|
|
use collections::HashMap;
|
|
use gpui::{App, AppContext as _, Context, Entity, Global, SharedString, Task};
|
|
|
|
pub fn init(cx: &mut App) {
|
|
let registry = cx.new(|_cx| WebSearchRegistry::default());
|
|
cx.set_global(GlobalWebSearchRegistry(registry));
|
|
}
|
|
|
|
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
|
|
pub struct WebSearchProviderId(pub SharedString);
|
|
|
|
pub trait WebSearchProvider {
|
|
fn id(&self) -> WebSearchProviderId;
|
|
fn search(&self, query: String, cx: &mut App) -> Task<Result<WebSearchResponse>>;
|
|
}
|
|
|
|
struct GlobalWebSearchRegistry(Entity<WebSearchRegistry>);
|
|
|
|
impl Global for GlobalWebSearchRegistry {}
|
|
|
|
#[derive(Default)]
|
|
pub struct WebSearchRegistry {
|
|
providers: HashMap<WebSearchProviderId, Arc<dyn WebSearchProvider>>,
|
|
active_provider: Option<Arc<dyn WebSearchProvider>>,
|
|
}
|
|
|
|
impl WebSearchRegistry {
|
|
pub fn global(cx: &App) -> Entity<Self> {
|
|
cx.global::<GlobalWebSearchRegistry>().0.clone()
|
|
}
|
|
|
|
pub fn read_global(cx: &App) -> &Self {
|
|
cx.global::<GlobalWebSearchRegistry>().0.read(cx)
|
|
}
|
|
|
|
pub fn providers(&self) -> impl Iterator<Item = &Arc<dyn WebSearchProvider>> {
|
|
self.providers.values()
|
|
}
|
|
|
|
pub fn active_provider(&self) -> Option<Arc<dyn WebSearchProvider>> {
|
|
self.active_provider.clone()
|
|
}
|
|
|
|
pub fn set_active_provider(&mut self, provider: Arc<dyn WebSearchProvider>) {
|
|
self.active_provider = Some(provider.clone());
|
|
self.providers.insert(provider.id(), provider);
|
|
}
|
|
|
|
pub fn register_provider<T: WebSearchProvider + 'static>(
|
|
&mut self,
|
|
provider: T,
|
|
_cx: &mut Context<Self>,
|
|
) {
|
|
let id = provider.id();
|
|
let provider = Arc::new(provider);
|
|
self.providers.insert(id, provider.clone());
|
|
if self.active_provider.is_none() {
|
|
self.active_provider = Some(provider);
|
|
}
|
|
}
|
|
|
|
pub fn unregister_provider(&mut self, id: WebSearchProviderId) {
|
|
self.providers.remove(&id);
|
|
if self.active_provider.as_ref().map(|provider| provider.id()) == Some(id) {
|
|
self.active_provider = None;
|
|
}
|
|
}
|
|
}
|