@ 261105.2
current
local Previewer = {}

Previewer.fzf = {}
Previewer.fzf.cmd = function() return require "fzf-lua.previewer.fzf".cmd end
Previewer.fzf.bat = function() return require "fzf-lua.previewer.fzf".bat end
Previewer.fzf.head = function() return require "fzf-lua.previewer.fzf".head end
Previewer.fzf.cmd_async = function() return require "fzf-lua.previewer.fzf".cmd_async end
Previewer.fzf.bat_async = function() return require "fzf-lua.previewer.fzf".bat_async end
Previewer.fzf.git_diff = function() return require "fzf-lua.previewer.fzf".git_diff end
Previewer.fzf.man_pages = function() return require "fzf-lua.previewer.fzf".man_pages end
Previewer.fzf.help_tags = function() return require "fzf-lua.previewer.fzf".help_tags end
Previewer.fzf.codeaction = function() return require "fzf-lua.previewer.codeaction".native end
Previewer.fzf.undotree = function() return require "fzf-lua.providers.undotree".native end
Previewer.fzf.nvim_server = function() return require "fzf-lua.previewer.fzf".nvim_server end

Previewer.builtin = {}
Previewer.builtin.buffer_or_file = function()
  return require "fzf-lua.previewer.builtin".buffer_or_file
end
Previewer.builtin.help_tags = function() return require "fzf-lua.previewer.builtin".help_tags end
Previewer.builtin.man_pages = function() return require "fzf-lua.previewer.builtin".man_pages end
Previewer.builtin.marks = function() return require "fzf-lua.previewer.builtin".marks end
Previewer.builtin.jumps = function() return require "fzf-lua.previewer.builtin".jumps end
Previewer.builtin.tags = function() return require "fzf-lua.previewer.builtin".tags end
Previewer.builtin.quickfix = function() return require "fzf-lua.previewer.builtin".quickfix end
Previewer.builtin.highlights = function() return require "fzf-lua.previewer.builtin".highlights end
Previewer.builtin.autocmds = function() return require "fzf-lua.previewer.builtin".autocmds end
Previewer.builtin.keymaps = function() return require "fzf-lua.previewer.builtin".keymaps end
Previewer.builtin.nvim_options = function() return require "fzf-lua.previewer.builtin".nvim_options end
Previewer.builtin.codeaction = function() return require "fzf-lua.previewer.codeaction".builtin end
Previewer.builtin.undotree = function() return require "fzf-lua.providers.undotree".builtin end

Previewer.swiper = {}
Previewer.swiper.default = function() return require "fzf-lua.previewer.swiper".default end


---@class fzf-lua.config.Previewer
---@field new? fun(opts: fzf-lua.config.Previewer, opt: fzf-lua.config.Previewer, o: fzf-lua.config.Resolved)
---@field _new? function(opt: fzf-lua.config.Previewer, o: fzf-lua.config.Resolved)
---@field _ctor? function(opt: fzf-lua.config.Previewer, o: fzf-lua.config.Resolved)
---@field cmd? string
---@field args? string
---@field preview_offset? string
---@field theme? string
---@field pager? string|function
---@field _fn_git_icons? table[]|fun():table?
---@field vterm? boolean use builtin terminal buffer (nvim_open_term) for preview
---builtin
---@field title_fnamemodify? function

---Instantiate previewer from spec
---@param spec? fzf-lua.config.Previewer|string
---@param opts table
---@return fzf-lua.previewer.Fzf|fzf-lua.previewer.Builtin?
Previewer.new = function(spec, opts)
  if not spec then return end
  local previewer, preview_opts = nil, nil
  if type(spec) == "string" then
    preview_opts = FzfLua.config.globals.previewers[spec]
    if not preview_opts then
      FzfLua.utils.warn(("invalid previewer '%s'"):format(spec))
    end
  elseif type(spec) == "table" then
    preview_opts = spec
  end
  -- Backward compat: can instantiate with `_ctor|new|_new`
  if preview_opts and type(preview_opts.new) == "function" then
    previewer = preview_opts:new(preview_opts, opts)
  elseif preview_opts and type(preview_opts._new) == "function" then
    previewer = preview_opts._new()(preview_opts, opts)
  elseif preview_opts and type(preview_opts._ctor) == "function" then
    previewer = preview_opts._ctor()(preview_opts, opts)
  end
  if preview_opts and preview_opts.vterm then ---@cast previewer fzf-lua.previewer.Fzf
    return require("fzf-lua.previewer.builtin").vterm:new(preview_opts, opts, previewer)
  end
  return previewer
end

---@alias fzf-lua.preview.spec string|function|fzf-lua.PreviewCmdSpec|fzf-lua.PreviewDataSpec

---@class fzf-lua.PreviewCmdSpec
---@field [1] fzf-lua.shell.cmd?
---@field fn fzf-lua.shell.cmd?
---@field field_index string?
---@field type 'cmd'

---@class fzf-lua.PreviewDataSpec
---@field [1] fzf-lua.shell.data?
---@field fn fzf-lua.shell.data?
---@field field_index string?
---@field type 'data'

---convert preview action functions to strings using our shell wrapper
---@param preview fzf-lua.preview.spec
---@param opts table
---@return string?
Previewer.normalize_spec = function(preview, opts)
  if type(preview) == "function" then
    return (FzfLua.shell.stringify_data(preview, opts, "{}"))
  elseif type(preview) == "table" then
    local func = assert(preview.fn or preview[1])
    -- by default we use current item only "{}"
    -- using "{+}" will send multiple selected items
    local field_index = preview.field_index or "{}"
    local stringify = preview.type == "cmd" and FzfLua.shell.stringify_cmd
        or FzfLua.shell.stringify_data
    ---@cast func fzf-lua.shell.cmd
    return (stringify(func, opts, field_index))
  else
    return preview
  end
end

return Previewer