diff --git a/lua/telescope/_extensions/telescope_knot.lua b/lua/telescope/_extensions/telescope_knot.lua index 40e3483..455286f 100644 --- a/lua/telescope/_extensions/telescope_knot.lua +++ b/lua/telescope/_extensions/telescope_knot.lua @@ -7,37 +7,53 @@ local log = require('plenary.log').new { level = 'info', } -local telescope_knot = {} +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 = {} - local entries = vim.tbl_map(function(zone) - return zone.name - end, results) + 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 = "Zones", + prompt_title = "Records", sorter = conf.generic_sorter(opts), finder = finders.new_table(entries), previewer = previewers.new_buffer_previewer({ - title = "Zone", + title = "Record", define_preview = function(self, entry) - local zone = {} - for _, z in ipairs(results) do - if z.name == entry.display then - zone = z - break - end - end - if zone then - local formatted_zone = vim.tbl_map( - function(record) - return record.rtype .. " " .. record.name .. " " .. record.data - end, - zone["records"]) - vim.api.nvim_buf_set_lines(self.state.bufnr, 0, 0, false, formatted_zone) - end + local record = _filter_records(entry, records) + vim.api.nvim_buf_set_lines(self.state.bufnr, 0, 0, false, record) end }),