diff --git a/lua/chai/autocmds.lua b/lua/chai/autocmds.lua new file mode 100644 index 0000000..a508f00 --- /dev/null +++ b/lua/chai/autocmds.lua @@ -0,0 +1,55 @@ +local M = {} + +local group = vim.api.nvim_create_augroup('ChaiAutocmds', { clear = true }) + +local buffers = require('chai.buffers') + +local function buffer_handling_init() + local create_autocmd = vim.api.nvim_create_autocmd + + create_autocmd('BufEnter', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_enter(args.buf) + end + }) + + create_autocmd({ 'BufDelete' }, { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_hide(args.buf) + end + }) + + create_autocmd({ 'BufWipeout' }, { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.destroy_buffer(args.buf) + end + }) + + create_autocmd('BufReadCmd', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.create_buffer(args.buf) + end + }) + + create_autocmd('BufWriteCmd', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_write(args.buf) + end + }) +end + +function M.setup() + buffer_handling_init() +end + +return M diff --git a/lua/chai/buffers.lua b/lua/chai/buffers.lua new file mode 100644 index 0000000..fdd4a31 --- /dev/null +++ b/lua/chai/buffers.lua @@ -0,0 +1,72 @@ +-- buffers API, loads buffers from ./buffers/*.lua + +local M = {} + +local buffer_list = { + 'test', +} + +local buffers = {} + +function M.setup() + -- Init stuff +end + +-- should return created chai buffer +local function resolve_buffer_path(path) + for _, value in ipairs(buffer_list) do + local buf = require('chai.buffers.' .. value).check(path) + if buf ~= nil then + return buf + end + end + + -- user is idiot imbecyle etc + error("Invalid path " .. path) +end + +function M.create_buffer(buffer) + buffers[buffer] = resolve_buffer_path(vim.api.nvim_buf_get_name(0)) + if type(buffers[buffer].init) == 'function' then + buffers[buffer].init(buffer) + end +end + +function M.destroy_buffer(buffer) + if buffers[buffer] == nil then + return + end + if type(buffers[buffer].destroy) == 'function' then + buffers[buffer].destroy(buffer) + end + buffers[buffer] = nil +end + +function M.on_hide(buffer) + if buffers[buffer] == nil then + return + end + if type(buffers[buffer].on_hide) == 'function' then + buffers[buffer].on_hide(buffer) + end +end + +function M.on_enter(buffer) + if buffers[buffer] == nil then + return + end + if type(buffers[buffer].on_enter) == 'function' then + buffers[buffer].on_enter(buffer) + end +end + +function M.on_write(buffer) + if buffers[buffer] == nil then + return + end + if type(buffers[buffer].on_write) == 'function' then + buffers[buffer].on_write(buffer) + end +end + +return M diff --git a/lua/chai/buffers/test.lua b/lua/chai/buffers/test.lua new file mode 100644 index 0000000..ec72042 --- /dev/null +++ b/lua/chai/buffers/test.lua @@ -0,0 +1,34 @@ +local M = {} + +local Buffer = {} + +function Buffer.init(vim_buffer) + vim.api.nvim_buf_set_lines(vim_buffer, 0, -1, false, { "press q to exit" }) + + local provider_list = { "Providers:" } + + for key, value in pairs(require('chai.config').options.providers) do + table.insert(provider_list, key .. " " .. value.url) + end + + vim.api.nvim_buf_set_lines(vim_buffer, 3, -1, false, provider_list) + + vim.keymap.set({ "n", "x" }, "q", function() + vim.api.nvim_buf_delete(vim_buffer, { force = true }) + end, { buffer = vim_buffer }) + + vim.bo[vim_buffer].modifiable = false + vim.bo[vim_buffer].modified = false +end + +function M.check(path) + if string.match(path, '^chai://test/?$') then + local buffer = vim.deepcopy(Buffer) + buffer.args = {} + + return buffer + end + return nil +end + +return M diff --git a/lua/chai/config.lua b/lua/chai/config.lua index 7fd97cc..2b81039 100644 --- a/lua/chai/config.lua +++ b/lua/chai/config.lua @@ -1,7 +1,7 @@ local M = {} M.defaults = { - servers = {}, + providers = {}, } M.options = {} diff --git a/lua/chai/init.lua b/lua/chai/init.lua index 75d9a41..9275dc3 100644 --- a/lua/chai/init.lua +++ b/lua/chai/init.lua @@ -1,6 +1,8 @@ local M = {} local config = require('chai.config') +local autocmds = require('chai.autocmds') +local buffers = require('chai.buffers') local commands = require('chai.commands') --- initializes chai.nvim plugin @@ -9,6 +11,9 @@ function M.setup(opts) -- set up configuration config.setup(opts) + buffers.setup() + autocmds.setup() + -- add commands commands.setup() end diff --git a/lua/chai/providers.lua b/lua/chai/providers.lua new file mode 100644 index 0000000..27b7b5f --- /dev/null +++ b/lua/chai/providers.lua @@ -0,0 +1,26 @@ +local M = {} + +local config = require('chai.config') + +local provider_instances = {} + +-- lazy loads providers of course +function M.get_provider(name) + if provider_instances[name] ~= nil then + return provider_instances[name] + end + + if config.options.providers[name] == nil then + error('unknown provider') + end + + local provider_config = config.options.providers[name] + + local provider = require('chai.providers.' .. provider_config.type) + + local provider_instance = provider.init(provider_config) + provider_instances[name] = provider_instance + return provider_instance +end + +return M diff --git a/lua/chai/providers/gitea/init.lua b/lua/chai/providers/gitea/init.lua new file mode 100644 index 0000000..b20486d --- /dev/null +++ b/lua/chai/providers/gitea/init.lua @@ -0,0 +1,12 @@ +local M + +local GiteaProvider = {} + +function M.init(config) + local provider = vim.deepcopy(GiteaProvider) + provider.config = config + + return provider +end + +return M diff --git a/lua/chai/providers/github/init.lua b/lua/chai/providers/github/init.lua new file mode 100644 index 0000000..5694f6f --- /dev/null +++ b/lua/chai/providers/github/init.lua @@ -0,0 +1,12 @@ +local M + +local GithubProvider = {} + +function M.init(config) + local provider = vim.deepcopy(GithubProvider) + provider.config = config + + return provider +end + +return M