local pickers = require("telescope.pickers") local finders = require("telescope.finders") local conf = require("telescope.config").values local previewers = require("telescope.previewers") local log = require('plenary.log').new { plugin = 'telescope_knot', level = 'info', } local _get_name = function(record) local name = record.rtype .. " " .. record.name .. " " .. record.data return name end local _filter_records = function(rec, records) local r = {} local record_name = rec.value for _, record in ipairs(records) do local name = _get_name(record) if name == record_name then r = { "ZONE", record.zone, "RTYPE", record.rtype, "NAME", record.name, "DATA", record.data, "TTL", record.ttl, "URL", record.url } end end return r end local telescope_knot = {} telescope_knot.zones = function(opts) local results = vim.json.decode(vim.fn.system("knotctl --json list")) local records = {} for _, zone in ipairs(results) do for _, record in ipairs(zone.records) do if record then record.zone = zone.name table.insert(records, record) end end end local entries = vim.tbl_map( function(record) return _get_name(record) end, records ) pickers.new(opts, { dropdown = true, prompt_title = "Records", sorter = conf.generic_sorter(opts), finder = finders.new_table(entries), previewer = previewers.new_buffer_previewer({ title = "Record", define_preview = function(self, entry) local record = _filter_records(entry, records) vim.api.nvim_buf_set_lines(self.state.bufnr, 0, 0, false, record) end }), }):find() end return require('telescope').register_extension({ exports = { telescope_knot = telescope_knot.zones, }, })