use zed_extension_api::{self as zed, settings::LspSettings, Result}; const PROTOBUF_LANGUAGE_SERVER_NAME: &str = "protobuf-language-server"; struct ProtobufLanguageServerBinary { path: String, args: Option>, } struct ProtobufExtension; impl ProtobufExtension { fn language_server_binary( &self, _language_server_id: &zed::LanguageServerId, worktree: &zed::Worktree, ) -> Result { let binary_settings = LspSettings::for_worktree("protobuf-language-server", worktree) .ok() .and_then(|lsp_settings| lsp_settings.binary); let binary_args = binary_settings .as_ref() .and_then(|binary_settings| binary_settings.arguments.clone()); if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { return Ok(ProtobufLanguageServerBinary { path, args: binary_args, }); } if let Some(path) = worktree.which(PROTOBUF_LANGUAGE_SERVER_NAME) { return Ok(ProtobufLanguageServerBinary { path, args: binary_args, }); } Err(format!("{PROTOBUF_LANGUAGE_SERVER_NAME} not found in PATH",)) } } impl zed::Extension for ProtobufExtension { fn new() -> Self { Self } fn language_server_command( &mut self, language_server_id: &zed_extension_api::LanguageServerId, worktree: &zed_extension_api::Worktree, ) -> zed_extension_api::Result { let binary = self.language_server_binary(language_server_id, worktree)?; Ok(zed::Command { command: binary.path, args: binary .args .unwrap_or_else(|| vec!["-logs".into(), "".into()]), env: Default::default(), }) } } zed::register_extension!(ProtobufExtension);