summaryrefslogtreecommitdiff
path: root/lua/clever_f/direct_preview_planner.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/clever_f/direct_preview_planner.lua')
-rw-r--r--lua/clever_f/direct_preview_planner.lua37
1 files changed, 36 insertions, 1 deletions
diff --git a/lua/clever_f/direct_preview_planner.lua b/lua/clever_f/direct_preview_planner.lua
index e771b15..6735924 100644
--- a/lua/clever_f/direct_preview_planner.lua
+++ b/lua/clever_f/direct_preview_planner.lua
@@ -149,6 +149,41 @@ function M.case_grouping_settings(settings)
}
end
+function M.validate_marker_positions(view, positions)
+ require_view(view)
+ if type(positions) ~= "table" then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+
+ local result = {}
+ local seen = {}
+ local item_count = 0
+ for key, position in pairs(positions) do
+ if type(key) ~= "number"
+ or key ~= math.floor(key)
+ or key < 1
+ or key > #positions
+ then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+ position = domain.Position.coerce(position)
+ if not view:is_character_start(position) then
+ fail("direct preview marker must start an editor character", 2)
+ end
+ local identity = tostring(position.line) .. ":" .. tostring(position.byte_column)
+ if seen[identity] then
+ fail("direct preview marker positions must be unique", 2)
+ end
+ seen[identity] = true
+ result[key] = position
+ item_count = item_count + 1
+ end
+ if item_count ~= #positions then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+ return result
+end
+
function DirectPreviewPlanner:plan(view, origin, descriptor, count, settings)
local grouping = M.case_grouping_settings(settings)
local ignore_case = grouping.ignore_case
@@ -181,7 +216,7 @@ function DirectPreviewPlanner:plan(view, origin, descriptor, count, settings)
positions[#positions + 1] = M.marker_position(descriptor, record.position)
end
end
- return positions
+ return M.validate_marker_positions(view, positions)
end
function M.new(options)