local codesnap = require("vdelosnap")

-- The func param is a function that come from rust side, the function
-- may raise exception to user side, the run_generator_function is used to
-- handle these function and print it friendly
local function run_generator_function(func)
    xpcall(func, function(err)
        print(err)
    end)
end

local function take_snapshot(take_snapshot_function)
    return function(detail)
        local args = detail.fargs

        run_generator_function(function()
            take_snapshot_function(args[1])
        end)
    end
end

vim.api.nvim_create_user_command("CodeSnap", take_snapshot(codesnap.copy_into_clipboard), { nargs = "*", range = "%" })

vim.api.nvim_create_user_command("CodeSnapSave", take_snapshot(codesnap.save_snapshot), { nargs = "*", range = "%" })

vim.api.nvim_create_user_command(
    "CodeSnapASCII",
    take_snapshot(codesnap.copy_ascii_snapshot),
    { nargs = "*", range = "%" }
)

vim.api.nvim_create_user_command(
    "CodeSnapHighlight",
    take_snapshot(codesnap.highlight_mode_copy_into_clipboard),
    { nargs = "*", range = "%" }
)

vim.api.nvim_create_user_command(
    "CodeSnapSaveHighlight",
    take_snapshot(codesnap.highlight_mode_save_snapshot),
    { nargs = "*", range = "%" }
)
