1use zed_extension_api::{self as zed, Result, settings::LspSettings};
2
3use crate::language_servers::{BufLsp, ProtoLs, ProtobufLanguageServer};
4
5mod language_servers;
6
7struct ProtobufExtension {
8 protobuf_language_server: Option<ProtobufLanguageServer>,
9 protols: Option<ProtoLs>,
10 buf_lsp: Option<BufLsp>,
11}
12
13impl zed::Extension for ProtobufExtension {
14 fn new() -> Self {
15 Self {
16 protobuf_language_server: None,
17 protols: None,
18 buf_lsp: None,
19 }
20 }
21
22 fn language_server_command(
23 &mut self,
24 language_server_id: &zed_extension_api::LanguageServerId,
25 worktree: &zed_extension_api::Worktree,
26 ) -> zed_extension_api::Result<zed_extension_api::Command> {
27 match language_server_id.as_ref() {
28 ProtobufLanguageServer::SERVER_NAME => self
29 .protobuf_language_server
30 .get_or_insert_with(ProtobufLanguageServer::new)
31 .language_server_binary(worktree),
32
33 ProtoLs::SERVER_NAME => self
34 .protols
35 .get_or_insert_with(ProtoLs::new)
36 .language_server_binary(worktree),
37
38 BufLsp::SERVER_NAME => self
39 .buf_lsp
40 .get_or_insert_with(BufLsp::new)
41 .language_server_binary(worktree),
42
43 _ => Err(format!("Unknown language server ID {}", language_server_id)),
44 }
45 }
46
47 fn language_server_workspace_configuration(
48 &mut self,
49 server_id: &zed::LanguageServerId,
50 worktree: &zed::Worktree,
51 ) -> Result<Option<zed::serde_json::Value>> {
52 LspSettings::for_worktree(server_id.as_ref(), worktree)
53 .map(|lsp_settings| lsp_settings.settings)
54 }
55
56 fn language_server_initialization_options(
57 &mut self,
58 server_id: &zed::LanguageServerId,
59 worktree: &zed::Worktree,
60 ) -> Result<Option<zed_extension_api::serde_json::Value>> {
61 LspSettings::for_worktree(server_id.as_ref(), worktree)
62 .map(|lsp_settings| lsp_settings.initialization_options)
63 }
64}
65
66zed::register_extension!(ProtobufExtension);