proto.rs

 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);