aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/EventEmitter.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-09-03 01:26:03 +0200
committerGitHub <noreply@github.com>2022-09-03 01:26:03 +0200
commit73fb0ea926cf27f2107dfa1138f74a1f7999694d (patch)
treeddf324bfbabab1b06d3a9d6c0c6522057810022a /lua/mason-core/EventEmitter.lua
parentfix(fantomas): link correct fantomas binany name (#370) (diff)
downloadmason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.gz
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.bz2
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.lz
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.xz
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.tar.zst
mason-73fb0ea926cf27f2107dfa1138f74a1f7999694d.zip
fix(EventEmitter): properly deregister handlers, print errors that occur in handler (#373)
Diffstat (limited to 'lua/mason-core/EventEmitter.lua')
-rw-r--r--lua/mason-core/EventEmitter.lua30
1 files changed, 24 insertions, 6 deletions
diff --git a/lua/mason-core/EventEmitter.lua b/lua/mason-core/EventEmitter.lua
index 5d7aeaa0..403628a0 100644
--- a/lua/mason-core/EventEmitter.lua
+++ b/lua/mason-core/EventEmitter.lua
@@ -1,3 +1,4 @@
+local log = require "mason-core.log"
---@class EventEmitter
---@field private __event_handlers table<any, table<fun(), fun()>>
---@field private __event_handlers_once table<any, table<fun(), fun()>>
@@ -14,18 +15,31 @@ function EventEmitter.init(obj)
end
---@param event any
+---@param handler fun(...): any
+local function call_handler(event, handler, ...)
+ local ok, err = pcall(handler, ...)
+ if not ok then
+ vim.schedule(function()
+ log.fmt_warn("EventEmitter handler failed for event %s with error %s", event, err)
+ vim.api.nvim_err_writeln(err)
+ end)
+ end
+end
+
+---@param event any
function EventEmitter:emit(event, ...)
if self.__event_handlers[event] then
for handler in pairs(self.__event_handlers[event]) do
- pcall(handler, ...)
+ call_handler(event, handler, ...)
end
end
if self.__event_handlers_once[event] then
for handler in pairs(self.__event_handlers_once[event]) do
- pcall(handler, ...)
- self.__event_handlers_once[handler] = nil
+ call_handler(event, handler, ...)
+ self.__event_handlers_once[event][handler] = nil
end
end
+ return self
end
---@param event any
@@ -35,6 +49,7 @@ function EventEmitter:on(event, handler)
self.__event_handlers[event] = {}
end
self.__event_handlers[event][handler] = handler
+ return self
end
---@param event any
@@ -44,16 +59,19 @@ function EventEmitter:once(event, handler)
self.__event_handlers_once[event] = {}
end
self.__event_handlers_once[event][handler] = handler
+ return self
end
---@param event any
---@param handler fun(payload: any)
function EventEmitter:off(event, handler)
- if vim.tbl_get(self.__event_handlers, { event, handler }) then
+ if self.__event_handlers[event] then
self.__event_handlers[event][handler] = nil
- return true
end
- return false
+ if self.__event_handlers_once[event] then
+ self.__event_handlers_once[event][handler] = nil
+ end
+ return self
end
---@private