@@ -1,3 +1,4 @@
1+use helix_lsp::lsp;
12use helix_view::{document::Mode, Document, Editor, Theme, View};
23
34use crate::{args::Args, compositor::Compositor, ui};
@@ -228,6 +229,59 @@ impl Application {
228229 Notification::LogMessage(params) => {
229230 log::warn!("unhandled window/logMessage: {:?}", params);
230231 }
232+ Notification::ProgressMessage(params) => {
233+ let token = match params.token {
234+ lsp::NumberOrString::Number(n) => n.to_string(),
235+ lsp::NumberOrString::String(s) => s,
236+ };
237+ let msg = {
238+ let lsp::ProgressParamsValue::WorkDone(work) = params.value;
239+ let parts = match work {
240+ lsp::WorkDoneProgress::Begin(lsp::WorkDoneProgressBegin {
241+ title,
242+ message,
243+ percentage,
244+ ..
245+ }) => (Some(title), message, percentage.map(|n| n.to_string())),
246+ lsp::WorkDoneProgress::Report(lsp::WorkDoneProgressReport {
247+ message,
248+ percentage,
249+ ..
250+ }) => (None, message, percentage.map(|n| n.to_string())),
251+ lsp::WorkDoneProgress::End(lsp::WorkDoneProgressEnd {
252+ message,
253+ }) => {
254+ if let Some(message) = message {
255+ (None, Some(message), None)
256+ } else {
257+ self.editor.clear_status();
258+ return;
259+ }
260+ }
261+ };
262+ match parts {
263+ (Some(title), Some(message), Some(percentage)) => {
264+ format!("{}% {} - {}", percentage, title, message)
265+ }
266+ (Some(title), None, Some(percentage)) => {
267+ format!("{}% {}", percentage, title)
268+ }
269+ (Some(title), Some(message), None) => {
270+ format!("{} - {}", title, message)
271+ }
272+ (None, Some(message), Some(percentage)) => {
273+ format!("{}% {}", percentage, message)
274+ }
275+ (Some(title), None, None) => title,
276+ (None, Some(message), None) => message,
277+ (None, None, Some(percentage)) => format!("{}%", percentage),
278+ (None, None, None) => "".into(),
279+ }
280+ };
281+ let status = format!("[{}] {}", token, msg);
282+ self.editor.set_status(status);
283+ self.render();
284+ }
231285 _ => unreachable!(),
232286 }
233287 }