summaryrefslogtreecommitdiff
path: root/lua/clever_f
diff options
context:
space:
mode:
Diffstat (limited to 'lua/clever_f')
-rw-r--r--lua/clever_f/motion_executor.lua44
1 files changed, 44 insertions, 0 deletions
diff --git a/lua/clever_f/motion_executor.lua b/lua/clever_f/motion_executor.lua
index b66f0b7..cc3cc56 100644
--- a/lua/clever_f/motion_executor.lua
+++ b/lua/clever_f/motion_executor.lua
@@ -1,5 +1,6 @@
local destination_engine = require("clever_f.destination_engine")
local domain = require("clever_f.domain")
+local sequence_state = require("clever_f.sequence_state")
local text_topology = require("clever_f.text_topology")
local M = {}
@@ -87,6 +88,23 @@ local function require_destination_engine(engine)
return engine
end
+local function require_feedback_service(service)
+ if service ~= nil and (type(service) ~= "table"
+ or type(service.migrate_command) ~= "function")
+ then
+ fail("MotionExecutor feedback service must provide migrate_command", 3)
+ end
+ return service
+end
+
+local function require_state(state)
+ state = state or sequence_state.get()
+ if not sequence_state.is(state) then
+ fail("MotionExecutor state must be the plugin-global SequenceState", 3)
+ end
+ return state
+end
+
local executor_metatable = {
__index = MotionExecutor,
__newindex = function()
@@ -110,6 +128,10 @@ function MotionExecutor.new(options, dependencies)
destination_engine = require_destination_engine(
options.destination_engine or options.engine
),
+ feedback_service = require_feedback_service(
+ options.feedback_service or options.feedback
+ ),
+ state = require_state(options.state),
}
return executor
end
@@ -149,6 +171,27 @@ local function calculate(executor, request, origin)
)
end
+local function migrate_command_feedback(executor, request, origin, outcome)
+ local record = executor_records[executor]
+ local feedback = record.feedback_service
+ if feedback == nil then
+ return
+ end
+ feedback:migrate_command({
+ context = request.context,
+ origin = origin,
+ destination = outcome.endpoint,
+ plan = request.plan,
+ resolved_motion_plan = request.plan,
+ outcome = outcome,
+ count = request.count,
+ first_move = request.first_move,
+ moved_forward = request.moved_forward,
+ previous_moved_forward = record.state.moved_forward,
+ previous_moved_forward_initialized = record.state.moved_forward_initialized,
+ })
+end
+
function MotionExecutor:_execute_command(request)
local host = executor_records[self].host
local origin = host:read_cursor()
@@ -164,6 +207,7 @@ function MotionExecutor:_execute_command(request)
origin,
outcome.endpoint
)
+ migrate_command_feedback(self, request, origin, outcome)
return domain.ActionOutcome.from_search(outcome, request.plan.descriptor)
end