From d524076412bc7048404771870ffb4477422869d9 Mon Sep 17 00:00:00 2001 From: alemi Date: Tue, 17 Sep 2024 17:26:23 +0200 Subject: [PATCH] chore: global CODEMP object i dont really like global state but it seems to be necessary when working with callbacks --- lua/codemp/buffers.lua | 11 ++++---- lua/codemp/client.lua | 14 ++++++----- lua/codemp/command.lua | 43 ++++++++++++++++---------------- lua/codemp/init.lua | 22 ++++++++++------ lua/codemp/neo-tree/bridge.lua | 25 +++++++++---------- lua/codemp/neo-tree/commands.lua | 21 ++++++++-------- lua/codemp/session.lua | 18 ------------- lua/codemp/window.lua | 5 ++-- lua/codemp/workspace.lua | 15 ++++++----- 9 files changed, 80 insertions(+), 94 deletions(-) delete mode 100644 lua/codemp/session.lua diff --git a/lua/codemp/buffers.lua b/lua/codemp/buffers.lua index 8ad386c..9e0c6c6 100644 --- a/lua/codemp/buffers.lua +++ b/lua/codemp/buffers.lua @@ -1,5 +1,4 @@ local utils = require('codemp.utils') -local session = require('codemp.session') ---@type table local id_buffer_map = {} @@ -24,7 +23,7 @@ local function attach(name, buffer, content, nowait) vim.api.nvim_set_option_value('fileformat', 'unix', { buf = buffer }) vim.api.nvim_buf_set_name(buffer, name) - session.workspace:attach(name):and_then(function (controller) + CODEMP.workspace:attach(name):and_then(function (controller) if not nowait then local promise = controller:poll() for i=1, 20, 1 do @@ -139,7 +138,7 @@ local function detach(name) local buffer = buffer_id_map[name] id_buffer_map[buffer] = nil buffer_id_map[name] = nil - session.workspace:detach(name) + CODEMP.workspace:detach(name) vim.api.nvim_buf_delete(buffer, {}) print(" -- detached from buffer " .. name) @@ -153,7 +152,7 @@ local function sync(buffer) end local name = id_buffer_map[buffer] if name ~= nil then - local controller = session.workspace:get_buffer(name) + local controller = CODEMP.workspace:get_buffer(name) if controller ~= nil then local real_content = controller:content():await() local my_content = utils.buffer.get_content(buffer) @@ -175,10 +174,10 @@ local function create(buffer) if buffer == nil then buffer = vim.fn.expand("%p") end - if session.workspace == nil then + if CODEMP.workspace == nil then error("join a workspace first") end - session.workspace:create(buffer):and_then(function () + CODEMP.workspace:create(buffer):and_then(function () print(" ++ created buffer " .. buffer) require('codemp.window').update() end) diff --git a/lua/codemp/client.lua b/lua/codemp/client.lua index 56231ff..53be602 100644 --- a/lua/codemp/client.lua +++ b/lua/codemp/client.lua @@ -1,14 +1,16 @@ local workspace = require("codemp.workspace") local function connect() - if CODEMP.config.username == nil then - CODEMP.config.username = vim.g.codemp_username or vim.fn.input("username > ", "") + ---@type Config + local tmp_cfg = vim.tbl_extend('force', {}, CODEMP.config) + if not tmp_cfg.username then + tmp_cfg.username = vim.g.codemp_username or vim.fn.input("username > ", "") end - if CODEMP.config.password == nil then - CODEMP.config.password = vim.g.codemp_password or vim.fn.input("password > ", "") + if not tmp_cfg.password then + tmp_cfg.password = vim.g.codemp_password or vim.fn.input("password > ", "") end - CODEMP.native.connect(CODEMP.config):and_then(function (client) - require('codemp.session').client = client + CODEMP.native.connect(tmp_cfg):and_then(function (client) + CODEMP.client = client require('codemp.window').update() workspace.list() end) diff --git a/lua/codemp/command.lua b/lua/codemp/command.lua index b3a611b..89a1496 100644 --- a/lua/codemp/command.lua +++ b/lua/codemp/command.lua @@ -1,4 +1,3 @@ -local session = require('codemp.session') local buffers = require('codemp.buffers') local workspace = require('codemp.workspace') local utils = require('codemp.utils') @@ -33,15 +32,15 @@ local base_actions = { -- only available if state.client is not nil local connected_actions = { id = function() - print("> codemp::" .. session.client.id) + print("> codemp::" .. CODEMP.client.id) end, join = function(ws) if ws == nil then local opts = { prompt = "Select workspace to join:", format_item = function (x) return x.name end } - return vim.ui.select(session.available, opts, function (choice) + return vim.ui.select(CODEMP.available, opts, function (choice) if choice == nil then return end -- action canceled by user - workspace.join(session.available[choice].name) + workspace.join(CODEMP.available[choice].name) end) else workspace.join(ws) @@ -50,36 +49,36 @@ local connected_actions = { start = function(ws) if ws == nil then error("missing workspace name") end - session.client:create_workspace(ws):and_then(function () + CODEMP.client:create_workspace(ws):and_then(function () print(" <> created workspace " .. ws) workspace.list() end) end, available = function() - for _, ws in ipairs(session.client:list_workspaces(true, false):await()) do + for _, ws in ipairs(CODEMP.client:list_workspaces(true, false):await()) do print(" ++ " .. ws) end - for _, ws in ipairs(session.client:list_workspaces(false, true):await()) do + for _, ws in ipairs(CODEMP.client:list_workspaces(false, true):await()) do print(" -- " .. ws) end end, invite = function(user) local ws - if session.workspace ~= nil then - ws = session.workspace.name + if CODEMP.workspace ~= nil then + ws = CODEMP.workspace.name else ws = vim.fn.input("workspace > ", "") end - session.client:invite_to_workspace(ws, user):and_then(function () + CODEMP.client:invite_to_workspace(ws, user):and_then(function () print(" :: invited " .. user .. " to workspace " .. ws) end) end, disconnect = function() - print(" xx disconnecting client " .. session.client.id) - session.client = nil -- should drop and thus close everything + print(" xx disconnecting client " .. CODEMP.client.id) + CODEMP.client = nil -- should drop and thus close everything end, } @@ -110,13 +109,13 @@ local joined_actions = { delete = function(path) if path == nil then error("missing buffer name") end - session.workspace:delete(path):and_then(function() + CODEMP.workspace:delete(path):and_then(function() print(" xx deleted buffer " .. path) end) end, buffers = function() - for _, buf in ipairs(session.workspace:filetree()) do + for _, buf in ipairs(CODEMP.workspace:filetree()) do if buffers.map_rev[buf] ~= nil then print(" +- " .. buf) else @@ -141,7 +140,7 @@ local joined_actions = { buffers.attach(p, buffer) end if path == nil then - local filetree = session.workspace:filetree(nil, false) + local filetree = CODEMP.workspace:filetree(nil, false) return vim.ui.select(filetree, { prompt = "Select buffer to attach to:" }, function (choice) if choice == nil then return end -- action canceled by user doit(filetree[choice]) @@ -173,11 +172,11 @@ vim.api.nvim_create_user_command( fn = base_actions[action] end - if session.client ~= nil and connected_actions[action] ~= nil then + if CODEMP.client ~= nil and connected_actions[action] ~= nil then fn = connected_actions[action] end - if session.workspace ~= nil and joined_actions[action] ~= nil then + if CODEMP.workspace ~= nil and joined_actions[action] ~= nil then fn = joined_actions[action] end @@ -203,13 +202,13 @@ vim.api.nvim_create_user_command( n = n + 1 suggestions[n] = sugg end - if session.client ~= nil then + if CODEMP.client ~= nil then for sugg, _ in pairs(connected_actions) do n = n + 1 suggestions[n] = sugg end end - if session.workspace ~= nil then + if CODEMP.workspace ~= nil then for sugg, _ in pairs(joined_actions) do n = n + 1 suggestions[n] = sugg @@ -218,11 +217,11 @@ vim.api.nvim_create_user_command( return filter(lead, suggestions) elseif stage == 3 then if args[#args-1] == 'attach' or args[#args-1] == 'detach' then - if session.client ~= nil and session.workspace ~= nil then - return filter(lead, session.workspace:filetree()) + if CODEMP.client ~= nil and CODEMP.workspace ~= nil then + return filter(lead, CODEMP.workspace:filetree()) end elseif args[#args-1] == 'join' then - return filter(lead, session.available, function(ws) return ws.name end) + return filter(lead, CODEMP.available, function(ws) return ws.name end) end return {} diff --git a/lua/codemp/init.lua b/lua/codemp/init.lua index 48060b7..757ed11 100644 --- a/lua/codemp/init.lua +++ b/lua/codemp/init.lua @@ -1,14 +1,26 @@ +---@class WorkspaceReference +---@field name string +---@field owned boolean + if CODEMP == nil then ---@class CodempGlobal + ---@field rt? RuntimeDriver background codemp runtime + ---@field client? Client currently connected client + ---@field workspace? Workspace current active workspace + ---@field available? WorkspaceReference[] available workspaces to connect to + ---@field timer? any libuv timer + ---@field config Config codemp configuration + ---@field setup fun(opts: Config): nil update codemp configuration CODEMP = { rt = nil, - session = nil, native = nil, timer = nil, config = { neo_tree = false, timer_interval = 20, debug = false, + username = "", + password = "", }, setup = function (opts) CODEMP.config = vim.tbl_extend('force', CODEMP.config, opts) @@ -26,19 +38,15 @@ if CODEMP.native == nil then --end, true) end -if CODEMP.session == nil then - CODEMP.session = require('codemp.session') -end - if CODEMP.rt == nil then CODEMP.rt = CODEMP.native.spawn_runtime_driver() -- spawn thread to drive tokio runtime vim.api.nvim_create_autocmd( {"ExitPre"}, { callback = function (_ev) - if CODEMP.session.client ~= nil then + if CODEMP.client ~= nil then print(" xx disconnecting codemp client") - CODEMP.session.client = nil + CODEMP.client = nil end CODEMP.rt:stop() end diff --git a/lua/codemp/neo-tree/bridge.lua b/lua/codemp/neo-tree/bridge.lua index ea61652..d1e2602 100644 --- a/lua/codemp/neo-tree/bridge.lua +++ b/lua/codemp/neo-tree/bridge.lua @@ -1,5 +1,4 @@ local renderer = require("neo-tree.ui.renderer") -local codemp = require("codemp.session") local buf_manager = require("codemp.buffers") ---@module 'nui.tree' @@ -125,15 +124,15 @@ M.update_state = function(state) } } - if codemp.workspace ~= nil then - local ws_section = new_root("#" .. codemp.workspace.name) - for i, path in ipairs(codemp.workspace:filetree()) do - table.insert(ws_section.children, new_item(codemp.workspace.name, path)) + if CODEMP.workspace ~= nil then + local ws_section = new_root("#" .. CODEMP.workspace.name) + for i, path in ipairs(CODEMP.workspace:filetree()) do + table.insert(ws_section.children, new_item(CODEMP.workspace.name, path)) end local usr_section = new_root("users") for user, buffer in pairs(buf_manager.users) do - table.insert(usr_section.children, new_user(codemp.workspace.name, user)) + table.insert(usr_section.children, new_user(CODEMP.workspace.name, user)) end table.insert(ws_section.children, spacer()) table.insert(ws_section.children, usr_section) @@ -142,23 +141,23 @@ M.update_state = function(state) table.insert(root, ws_section) end - if codemp.client ~= nil then + if CODEMP.client ~= nil then local ws_section = new_root("workspaces") - for _, ws in ipairs(codemp.available) do + for _, ws in ipairs(CODEMP.available) do table.insert(ws_section.children, new_workspace(ws.name, ws.owned)) end table.insert(root, spacer()) table.insert(root, ws_section) local status_section = new_root("client") - table.insert(status_section.children, new_entry("id", codemp.client.id)) - table.insert(status_section.children, new_entry("name", codemp.client.username)) + table.insert(status_section.children, new_entry("id", CODEMP.client.id)) + table.insert(status_section.children, new_entry("name", CODEMP.client.username)) table.insert(root, spacer()) table.insert(root, status_section) end - if codemp.client == nil then + if CODEMP.client == nil then table.insert(root, spacer()) table.insert(root, new_button("[connect]")) end @@ -166,8 +165,8 @@ M.update_state = function(state) renderer.show_nodes(root, state) local new_state = "disconnected" - if codemp.client ~= nil then new_state = "connected" end - if codemp.workspace ~= nil then new_state = "joined" end + if CODEMP.client ~= nil then new_state = "connected" end + if CODEMP.workspace ~= nil then new_state = "joined" end if last_state ~= new_state then expand(state.tree) end last_state = new_state diff --git a/lua/codemp/neo-tree/commands.lua b/lua/codemp/neo-tree/commands.lua index 02e364d..a280ab2 100644 --- a/lua/codemp/neo-tree/commands.lua +++ b/lua/codemp/neo-tree/commands.lua @@ -2,7 +2,6 @@ local cc = require("neo-tree.sources.common.commands") local utils = require("neo-tree.utils") local codemp_utils = require("codemp.utils") local manager = require("neo-tree.sources.manager") -local session = require("codemp.session") local buf_manager = require("codemp.buffers") local ws_manager = require("codemp.workspace") local client_manager = require("codemp.client") @@ -27,16 +26,16 @@ M.open = function(state, path, extra) if selected.type == "entry" then return end if selected.type == "root" then return toggle(selected) end if selected.type == "button" then - if selected.name == "[connect]" and session.client == nil then + if selected.name == "[connect]" and CODEMP.client == nil then client_manager.connect() end return end if selected.type == "workspace" then - if session.workspace ~= nil and session.workspace.name ~= selected.name then + if CODEMP.workspace ~= nil and CODEMP.workspace.name ~= selected.name then error("must leave current workspace first") end - if session.workspace == nil then + if CODEMP.workspace == nil then ws_manager.join(selected.name) end manager.refresh("codemp") @@ -112,21 +111,21 @@ M.delete = function(state, path, extra) manager.refresh("codemp") end) elseif selected.type == "buffer" then - if session.workspace == nil then error("join a workspace first") end + if CODEMP.workspace == nil then error("join a workspace first") end vim.ui.input({ prompt = "delete buffer '" .. selected.name .. "'?" }, function (input) if input == nil then return end if not vim.startswith("y", string.lower(input)) then return end - session.workspace:delete(selected.name):and_then(function () + CODEMP.workspace:delete(selected.name):and_then(function () print("deleted buffer " .. selected.name) manager.refresh("codemp") end) end) elseif selected.type == "workspace" then - if session.client == nil then error("connect to server first") end + if CODEMP.client == nil then error("connect to server first") end vim.ui.input({ prompt = "delete buffer '" .. selected.name .. "'?" }, function (input) if input == nil then return end if not vim.startswith("y", string.lower(input)) then return end - session.client:delete_workspace(selected.name):and_then(function () + CODEMP.client:delete_workspace(selected.name):and_then(function () print("deleted workspace " .. selected.name) manager.refresh("codemp") end) @@ -140,14 +139,14 @@ M.add = function(state, path, extra) if vim.startswith(selected.name, "#") then vim.ui.input({ prompt = "new buffer path" }, function(input) if input == nil or input == "" then return end - session.workspace:create(input):and_then(function () + CODEMP.workspace:create(input):and_then(function () manager.refresh("codemp") end) end) elseif selected.name == "workspaces" then vim.ui.input({ prompt = "new workspace name" }, function(input) if input == nil or input == "" then return end - session.client:create_workspace(input):and_then(function () + CODEMP.client:create_workspace(input):and_then(function () require('codemp.workspace').list() end) end) @@ -155,7 +154,7 @@ M.add = function(state, path, extra) elseif selected.type == "workspace" then vim.ui.input({ prompt = "user name to invite" }, function(input) if input == nil or input == "" then return end - session.client:invite_to_workspace(selected.name, input):and_then(function () + CODEMP.client:invite_to_workspace(selected.name, input):and_then(function () print("invited user " .. input .. " to workspace " .. selected.name) end) end) diff --git a/lua/codemp/session.lua b/lua/codemp/session.lua deleted file mode 100644 index caab786..0000000 --- a/lua/codemp/session.lua +++ /dev/null @@ -1,18 +0,0 @@ ----@type Workspace -local workspace - ----@type Client -local client - ----@class WorkspaceReference ----@field name string ----@field owned boolean - ----@type WorkspaceReference[] -local available_workspaces = {} - -return { - workspace = workspace, - client = client, - available = available_workspaces, -} diff --git a/lua/codemp/window.lua b/lua/codemp/window.lua index c7095b0..f9e3ebe 100644 --- a/lua/codemp/window.lua +++ b/lua/codemp/window.lua @@ -9,7 +9,6 @@ end -- legacy crude filetree if neo-tree is not available -local session = require('codemp.session') local utils = require('codemp.utils') local buffers = require('codemp.buffers') @@ -41,10 +40,10 @@ local function update_window() local buffer_to_row = {} local user_to_row = {} local off = {} - local tree = session.workspace:filetree() + local tree = CODEMP.workspace:filetree() vim.api.nvim_set_option_value('modifiable', true, { buf = buffer_id }) local tmp = ">| codemp\n" - tmp = tmp .. " |: " .. session.workspace.name .. "\n" + tmp = tmp .. " |: " .. CODEMP.workspace.name .. "\n" tmp = tmp .. " |\n" local base_row = 3 for n, path in pairs(tree) do diff --git a/lua/codemp/workspace.lua b/lua/codemp/workspace.lua index ced1801..21c246d 100644 --- a/lua/codemp/workspace.lua +++ b/lua/codemp/workspace.lua @@ -1,6 +1,5 @@ local utils = require('codemp.utils') local buffers = require('codemp.buffers') -local session = require('codemp.session') ---@class UserHighlight ---@field ns integer namespace to use for this user @@ -12,21 +11,21 @@ local user_hl = {} local function fetch_workspaces_list() local new_list = {} - session.client:list_workspaces(true, false):and_then(function (owned) + CODEMP.client:list_workspaces(true, false):and_then(function (owned) for _, ws in pairs(owned) do table.insert(new_list, { name = ws, owned = true, }) end - session.client:list_workspaces(false, true):and_then(function (invited) + CODEMP.client:list_workspaces(false, true):and_then(function (invited) for _, ws in pairs(invited) do table.insert(new_list, { name = ws, owned = false, }) end - session.available = new_list + CODEMP.available = new_list require('codemp.window').update() end) end) @@ -109,7 +108,7 @@ end ---@param workspace string workspace name to join ---join a workspace and register event handlers local function join(workspace) - session.client:join_workspace(workspace):and_then(function (ws) + CODEMP.client:join_workspace(workspace):and_then(function (ws) print(" >< joined workspace " .. ws.name) register_cursor_callback(ws) register_cursor_handler(ws) @@ -138,15 +137,15 @@ local function join(workspace) end ) - session.workspace = ws + CODEMP.workspace = ws require('codemp.window').update() end) end local function leave() - session.client:leave_workspace(session.workspace.name) + CODEMP.client:leave_workspace(CODEMP.workspace.name) print(" -- left workspace") - session.workspace = nil + CODEMP.workspace = nil end return {